/ Hex Artifact Content
Login

Artifact 7bc85a618a8ae0d011675bb844c8a29a8a6632db:


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 39  : pager.c,v 1.59
0350: 32 20 32 30 30 39 2f 30 36 2f 31 31 20 30 30 3a  2 2009/06/11 00:
0360: 34 37 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a  47:21 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 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  cArg,D,N,X)==0 )
11b0: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
11c0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
11d0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
11e0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
11f0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
1200: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
1210: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
1220: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
1230: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
1240: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
1250: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
1260: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
1270: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
1280: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
1290: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
12a0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
12b0: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
12c0: 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66 20 74  size. 16MB. If t
12d0: 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29  he xSectorsize()
12e0: 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75   method .** retu
12f0: 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67  rns a value larg
1300: 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68  er than this, th
1310: 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  en MAX_SECTOR_SI
1320: 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ZE is used inste
1330: 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c  ad..** This coul
1340: 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61  d conceivably ca
1350: 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66  use corruption f
1360: 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72  ollowing a power
1370: 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73   failure on.** s
1380: 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68  uch a system. Th
1390: 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  is is currently 
13a0: 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  an undocumented 
13b0: 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  limit..*/.#defin
13c0: 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e MAX_SECTOR_SIZ
13d0: 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f 2a 0a  E 0x0100000../*.
13e0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
13f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1400: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
1410: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
1420: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
1430: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
1440: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
1450: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
1460: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
1470: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
1480: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
1490: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
14a0: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
14b0: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
14c0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
14d0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
14e0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
14f0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
1500: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1510: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
1520: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
1530: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
1540: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
1550: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
1560: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
1570: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
1580: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
1590: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
15a0: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
15b0: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
15c0: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
15d0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
15e0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
15f0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
1600: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
1610: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
1620: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
1630: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
1640: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
1650: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
1660: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
1670: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1680: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
1690: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
16a0: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
16b0: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
16c0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
16d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
16e0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
16f0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
1700: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
1710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1720: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
1730: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
1740: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
1750: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
1760: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
1770: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1790: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
17a0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
17b0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
17c0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
17d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
17e0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
17f0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d  sub-journal */.}
1800: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  ;../*.** A open 
1810: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
1820: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1840: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43  ture..**.** errC
1850: 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  ode.**.**   Page
1860: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
1870: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
1880: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
1890: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f 72  RUPT, or.**   or
18a0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
18b0: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
18c0: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
18d0: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
18e0: 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69 73  ists.**   and is
18f0: 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65   returned as the
1900: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79   result of every
1910: 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49   major pager API
1920: 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 20   call.  The.**  
1930: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74   SQLITE_FULL ret
1940: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67  urn code is slig
1950: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20  htly different. 
1960: 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79  It persists only
1970: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20 20   until the.**   
1980: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
1990: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
19a0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
19b0: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
19c0: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c  **   SQLITE_FULL
19d0: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
19e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
19f0: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
1a00: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
1a10: 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65 79 20  **   APIs, they 
1a20: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  may still be use
1a30: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a  d successfully..
1a40: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c 69  **.** dbSizeVali
1a50: 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  d, dbSize, dbOri
1a60: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
1a70: 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67 69  e.**.**   Managi
1a80: 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ng the size of t
1a90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa0: 20 69 6e 20 70 61 67 65 73 20 69 73 20 61 20 6c   in pages is a l
1ab0: 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74 65  ittle complicate
1ac0: 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72 69  d..**   The vari
1ad0: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69 7a  able Pager.dbSiz
1ae0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
1af0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1b00: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1b10: 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72 72  .**   image curr
1b20: 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20  ently contains. 
1b30: 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  As the database 
1b40: 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73  image grows or s
1b50: 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 20  hrinks this.**  
1b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64   variable is upd
1b70: 61 74 65 64 2e 20 54 68 65 20 76 61 72 69 61 62  ated. The variab
1b80: 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  le Pager.dbFileS
1b90: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1ba0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20   number.**   of 
1bb0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1bc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1bd0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
1be0: 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62 53  t from Pager.dbS
1bf0: 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d 65  ize.**   if some
1c00: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1c10: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1c20: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1c30: 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74  but not yet writ
1c40: 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72 6f  ten.**   out fro
1c50: 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  m the cache to t
1c60: 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f  he actual file o
1c70: 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68  n disk. Or if th
1c80: 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e  e image has been
1c90: 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64 20  .**   truncated 
1ca0: 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  by an incrementa
1cb0: 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  l-vacuum operati
1cc0: 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62  on. The Pager.db
1cd0: 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c  OrigSize variabl
1ce0: 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20  e.**   contains 
1cf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1d00: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1d10: 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20 74  ase image when t
1d20: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
1d30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1d40: 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e 74  opened. The cont
1d50: 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65  ents of all thre
1d60: 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69 61  e of these varia
1d70: 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e 6c  bles is.**   onl
1d80: 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  y guaranteed to 
1d90: 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74 68  be correct if th
1da0: 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e  e boolean Pager.
1db0: 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74  dbSizeValid is t
1dc0: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  rue..**.**   TOD
1dd0: 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63 6f  O: Under what co
1de0: 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53 69  nditions is dbSi
1df0: 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c 65  zeValid set? Cle
1e00: 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ared?.**.** chan
1e10: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
1e20: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
1e30: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
1e40: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
1e50: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
1e60: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
1e70: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
1e80: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
1e90: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
1ea0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
1eb0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
1ec0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
1ed0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
1ee0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
1ef0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
1f00: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1f10: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
1f20: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
1f30: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
1f40: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
1f50: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
1f60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f70: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
1f80: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
1f90: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
1fa0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1fb0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
1fc0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
1fd0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
1fe0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
1ff0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
2000: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
2010: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
2020: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
2030: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
2040: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
2050: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
2060: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
2070: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
2080: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
2090: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
20a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
20b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
20c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
20d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
20e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
20f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2100: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
2110: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
2120: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
2130: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2140: 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a 2a  dbModified.**.**
2150: 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69 65     The dbModifie
2160: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  d flag is set wh
2170: 65 6e 65 76 65 72 20 61 20 64 61 74 61 62 61 73  enever a databas
2180: 65 20 70 61 67 65 20 69 73 20 64 69 72 74 69 65  e page is dirtie
2190: 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  d..**   It is cl
21a0: 65 61 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  eared at the end
21b0: 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61 63   of each transac
21c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74  tion..**.**   It
21d0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 63 6f   is used when co
21e0: 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68 65  mmitting or othe
21f0: 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20 74  rwise ending a t
2200: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a 2a  ransaction. If.*
2210: 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66 69  *   the dbModifi
2220: 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  ed flag is clear
2230: 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b 20   then less work 
2240: 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e 0a  has to be done..
2250: 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74 61  **.** journalSta
2260: 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  rted.**.**   Thi
2270: 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  s flag is set wh
2280: 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20 6d  enever the the m
2290: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  ain journal is s
22a0: 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ynced. .**.**   
22b0: 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69  The point of thi
22c0: 73 20 66 6c 61 67 20 69 73 20 74 68 61 74 20 69  s flag is that i
22d0: 74 20 6d 75 73 74 20 62 65 20 73 65 74 20 61 66  t must be set af
22e0: 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20 66 69  ter the .**   fi
22f0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
2300: 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c 20  er in a journal 
2310: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
2320: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2330: 20 20 20 41 66 74 65 72 20 74 68 69 73 20 68 61     After this ha
2340: 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65 77 20  s happened, new 
2350: 70 61 67 65 73 20 61 70 70 65 6e 64 65 64 20 74  pages appended t
2360: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
2370: 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65 65 64  **   do not need
2380: 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2390: 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c 20 61  SYNC flag set, a
23a0: 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6e 65  s they do not ne
23b0: 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69 74 20  ed.**   to wait 
23c0: 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  for a journal sy
23d0: 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79 20 63  nc before they c
23e0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
23f0: 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64 61  t to.**   the da
2400: 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 65 65  tabase file (see
2410: 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72 5f   function pager_
2420: 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20 20 0a  write())..**   .
2430: 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a  ** setMaster.**.
2440: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2450: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  le is used to en
2460: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6d 61  sure that the ma
2470: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2480: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69 66 20  e name.**   (if 
2490: 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77 72 69  any) is only wri
24a0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63 65 2e  urnal file once.
24c0: 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 63 6f  .**.**   When co
24d0: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
24e0: 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61 73 74  action, the mast
24f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2500: 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a 2a 2a  name (if any).**
2510: 20 20 20 6d 61 79 20 62 65 20 77 72 69 74 74 65     may be writte
2520: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
2530: 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68  al file while th
2540: 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c  e pager is still
2550: 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52   in.**   PAGER_R
2560: 45 53 45 52 56 45 44 20 73 74 61 74 65 20 28 73  ESERVED state (s
2570: 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  ee CommitPhaseOn
2580: 65 28 29 20 66 6f 72 20 74 68 65 20 61 63 74 69  e() for the acti
2590: 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74 68 65  on). It.**   the
25a0: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  n attempts to up
25b0: 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78 63 6c  grade to an excl
25c0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66 20 74  usive lock. If t
25d0: 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20 20  his attempt.**  
25e0: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53 51 4c   fails, then SQL
25f0: 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62 65 20  ITE_BUSY may be 
2600: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
2610: 75 73 65 72 20 61 6e 64 20 74 68 65 20 75 73 65  user and the use
2620: 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74 65 6d  r.**   may attem
2630: 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  pt to commit the
2640: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 67 61   transaction aga
2650: 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c 69 6e  in later (callin
2660: 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50 68 61  g.**   CommitPha
2670: 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29 2e 20  seOne() again). 
2680: 54 68 69 73 20 66 6c 61 67 20 69 73 20 75 73 65  This flag is use
2690: 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
26a0: 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73 74 65   the .**   maste
26b0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
26c0: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 74  s only written t
26d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26e0: 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  le the first.** 
26f0: 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50 68 61    time CommitPha
2700: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
2710: 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79  d..**.** doNotSy
2720: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  nc.**.**   This 
2730: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
2740: 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 73  and cleared by s
2750: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2760: 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ()..**.** needSy
2770: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  nc.**.**   TODO:
2780: 20 49 74 20 6d 69 67 68 74 20 62 65 20 65 61 73   It might be eas
2790: 69 65 72 20 74 6f 20 73 65 74 20 74 68 69 73 20  ier to set this 
27a0: 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74  variable in writ
27b0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a  eJournalHdr().**
27c0: 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74     and writeMast
27d0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79  erJournal() only
27e0: 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61  . Change its mea
27f0: 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65  ning to "unsynce
2800: 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20  d data.**   has 
2810: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2820: 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a  the journal"..**
2830: 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  .** subjInMemory
2840: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73  .**.**   This is
2850: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61   a boolean varia
2860: 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68  ble. If true, th
2870: 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  en any required 
2880: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
2890: 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   is opened as an
28a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
28b0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73  al file. If fals
28c0: 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72  e, then in-memor
28d0: 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e  y.**   sub-journ
28e0: 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65  als are only use
28f0: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
2900: 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a  pager files..*/.
2910: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
2920: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2930: 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs;          /* 
2940: 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  OS functions to 
2950: 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20  use for IO */.  
2960: 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  u8 exclusiveMode
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
2980: 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
2990: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58  locking_mode==EX
29a0: 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20  CLUSIVE */.  u8 
29b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20  journalMode;    
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f           /* On o
29d0: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
29e0: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
29f0: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2a00: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2a10: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2a20: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2a30: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2a40: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2a60: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
2a70: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
2a80: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2ab0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2ac0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2ad0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2ae0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2af0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
2b00: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
2b10: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
2b20: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
2b30: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
2b40: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
2b50: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
2b60: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
2b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2b80: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
2b90: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
2ba0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
2bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bc0: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
2bd0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
2be0: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c00: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
2c10: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
2c20: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2c30: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
2c40: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
2c50: 65 6d 62 65 72 73 20 74 68 61 74 20 61 72 65 20  embers that are 
2c60: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
2c70: 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
2c80: 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
2c90: 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61  ns. The other va
2ca0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
2cb0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
2cc0: 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61  re either consta
2cd0: 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  nt throughout th
2ce0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
2cf0: 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65  e pager, or else
2d00: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  .  ** used to st
2d10: 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ore configuratio
2d20: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  n parameters tha
2d30: 74 20 61 66 66 65 63 74 20 74 68 65 20 77 61 79  t affect the way
2d40: 20 74 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a   the pager .  **
2d50: 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a   operates..  **.
2d60: 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27    ** The 'state'
2d70: 20 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 73   variable is des
2d80: 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64  cribed in more d
2d90: 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68  etail along with
2da0: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69   the.  ** descri
2db0: 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61  ptions of the va
2dc0: 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65  lues it may take
2dd0: 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20   - PAGER_UNLOCK 
2de0: 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65  etc. Many of the
2df0: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69  .  ** other vari
2e00: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  ables in this bl
2e10: 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69 62 65  ock are describe
2e20: 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  d in the comment
2e30: 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20   directly .  ** 
2e40: 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73  above this class
2e50: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
2e60: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
2e90: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
2ea0: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
2eb0: 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20  8 dbModified;   
2ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ed0: 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ue if there are 
2ee0: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74  any changes to t
2ef0: 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65  he Db */.  u8 ne
2f00: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2f10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f20: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2f30: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f  urnal */.  u8 jo
2f50: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
2f60: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f70: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
2f80: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
2f90: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
2fa0: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
2fb0: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
2fc0: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
2fd0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
2fe0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3000: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3010: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3020: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3030: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3060: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3070: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3080: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30a0: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
30b0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
30c0: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30e0: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
30f0: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
3100: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
3110: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3120: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3130: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
3140: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
3150: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
3160: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
3170: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
3180: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
3190: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
31a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
31b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
31c0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
31d0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
31e0: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
31f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3200: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
3210: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
3220: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3240: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
3250: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
3260: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
3270: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3290: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
32a0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
32b0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
32c0: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
32f0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
3300: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
3310: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
3320: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
3330: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
3340: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
3350: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
3360: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
3370: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3380: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3390: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
33b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
33e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
33f0: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
3400: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
3410: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
3420: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
3430: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
3440: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
3450: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
3460: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3470: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
3480: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3490: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
34a0: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
34b0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 50  al header */.  P
34c0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
34d0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
34e0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
34f0: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
3500: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
3510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3520: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
3530: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
3540: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
3550: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
3560: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
3570: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
3580: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
3590: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35b0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
35c0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
35d0: 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 45 78  ck */..  int nEx
35e0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
35f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
3600: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
3610: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
3620: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
3630: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3640: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
3650: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
3660: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
3670: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
3680: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3690: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
36a0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
36b0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
36c0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
36d0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
36e0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
36f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3710: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
3720: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
3730: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
3740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3750: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
3760: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
3770: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
3780: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
3790: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
37a0: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
37b0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
37c0: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
37d0: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
37e0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
37f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3800: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
3810: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
3820: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
3830: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
3840: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
3850: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
3860: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
3870: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
3880: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
3890: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
38a0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
38b0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
38c0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
38d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
38e0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
38f0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
3900: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
3910: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
3920: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
3930: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
3940: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
3950: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
3960: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
3970: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
3980: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
3990: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
39a0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
39b0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
39c0: 75 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  use */.  i64 jou
39d0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
39e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
39f0: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
3a00: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
3a10: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
3a20: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
3a30: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
3a40: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
3a50: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
3a60: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
3a70: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3a80: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
3a90: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
3aa0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
3ab0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
3ac0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
3ad0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
3ae0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
3af0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
3b00: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
3b10: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
3b20: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
3b30: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
3b40: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
3b50: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
3b60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3b70: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
3b80: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
3b90: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3ba0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
3bb0: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
3bc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
3bd0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
3be0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
3bf0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
3c00: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
3c10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
3c20: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
3c30: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
3c40: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
3c50: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
3c60: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
3c70: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
3c80: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
3c90: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
3ca0: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
3cb0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3cc0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3cd0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3ce0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3cf0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3d00: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
3d10: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
3d20: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3d30: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3d40: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3d50: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3d60: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3d70: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3d80: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3d90: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3da0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3db0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
3dc0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3dd0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3de0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3df0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3e00: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3e10: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3e20: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3e30: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3e40: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3e50: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3e60: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3e70: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3e80: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3e90: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3ea0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3eb0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3ec0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3ed0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3ee0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3ef0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3f00: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3f10: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3f20: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3f30: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3f40: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3f50: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3f60: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3f70: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3f80: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3f90: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3fa0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3fb0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3fc0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3fd0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3fe0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3ff0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
4000: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
4010: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
4020: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
4030: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
4040: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
4050: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
4060: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
4070: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
4080: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
4090: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
40a0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
40b0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
40c0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
40d0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
40e0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
40f0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
4100: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
4110: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
4120: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
4130: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
4140: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
4150: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
4160: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
4170: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
4180: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
4190: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
41a0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
41b0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
41c0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
41d0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
41e0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
41f0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
4200: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
4210: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
4220: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
4230: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
4240: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
4250: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
4260: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
4270: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
4280: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
4290: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
42a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
42b0: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
42c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
42d0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
42e0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
42f0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
4300: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
4310: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
4320: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
4330: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
4340: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
4350: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
4360: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
4370: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
4380: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
4390: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
43a0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
43b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
43c0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
43d0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
43e0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
43f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
4400: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
4410: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
4420: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
4430: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
4440: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
4450: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
4460: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
4470: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
4480: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
4490: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
44a0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
44b0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
44c0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
44d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
44e0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
44f0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
4500: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
4510: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
4520: 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e  2147483647..#ifn
4530: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
4540: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
4550: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
4560: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
4570: 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  er) );.*/.static
4580: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
4590: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
45a0: 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20  Pager){..  /* A 
45b0: 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77  temp-file is alw
45c0: 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43  ays in PAGER_EXC
45d0: 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f  LUSIVE or PAGER_
45e0: 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f  SYNCED state. */
45f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4600: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
4610: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
4620: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
4630: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68   );..  /* The ch
4640: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
4650: 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  ag is always set
4660: 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20   for temp-files 
4670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
4680: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
4690: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
46a0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
46b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
46c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
46d0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
46e0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
46f0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
4700: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
4710: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
4720: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
4730: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
4740: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
4750: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
4760: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
4770: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
4780: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
4790: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
47a0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
47b0: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
47c0: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
47d0: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
47e0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
47f0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
4800: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
4810: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
4820: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
4830: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
4840: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
4850: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
4860: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
4870: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
4880: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
4890: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
48a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
48b0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
48c0: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
48d0: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
48e0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
48f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
4900: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
4910: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
4920: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
4930: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
4940: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4950: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4960: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4970: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
4980: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
4990: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
49a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
49b0: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
49c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
49d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
49e0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
49f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
4a00: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
4a10: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4a20: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
4a30: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4a40: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
4a50: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
4a60: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
4a70: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
4a80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
4a90: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
4aa0: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
4ab0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
4ac0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
4ad0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
4ae0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
4af0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4b10: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
4b20: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
4b30: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
4b40: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
4b50: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
4b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
4b70: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
4b80: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
4b90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4ba0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
4bb0: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
4bc0: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
4bd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4be0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
4bf0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
4c00: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
4c10: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
4c20: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
4c30: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
4c40: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
4c50: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
4c60: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
4c70: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
4c80: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4c90: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
4ca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
4cb0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
4cc0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4cd0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
4ce0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
4cf0: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
4d00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4d10: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4d20: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
4d30: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
4d40: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
4d50: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
4d60: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
4d70: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
4d80: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
4d90: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61   this macro is a
4da0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4db0: 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66   (type sqlite3_f
4dc0: 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e  ile*)..** Return
4dd0: 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20   0 if it is not 
4de0: 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  open, or non-zer
4df0: 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66  o (but not 1) if
4e00: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
4e10: 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78  is is so that ex
4e20: 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
4e30: 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a   written as:.**.
4e40: 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  **   if( isOpen(
4e50: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20  pPager->jfd) ){ 
4e60: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61  ....**.** instea
4e70: 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  d of.**.**   if(
4e80: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
4e90: 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f  ethods ){ ....*/
4ea0: 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28  .#define isOpen(
4eb0: 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65  pFd) ((pFd)->pMe
4ec0: 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66  thods)../*.** If
4ed0: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
4ee0: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
4ef0: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
4f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
4f10: 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
4f20: 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65  file *pFd, int e
4f30: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73  Lock){.  if( !is
4f40: 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20  Open(pFd) ){.   
4f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4f60: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
4f70: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
4f80: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
4f90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4fa0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
4fb0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
4fc0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
4fd0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
4fe0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4ff0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
5000: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
5010: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
5020: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
5030: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
5040: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5050: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
5060: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
5070: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
5080: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
5090: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
50a0: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
50b0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
50c0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
50d0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
50e0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
50f0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
5100: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
5110: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
5120: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
5130: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
5140: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
5150: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
5160: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
5170: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
5180: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
5190: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
51a0: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
51b0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
51c0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
51d0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
51e0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
51f0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
5200: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
5220: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
5230: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
5240: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
5250: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
5260: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
5270: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
5280: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
5290: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
52a0: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
52b0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
52c0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
52d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
5300: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
5310: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
5320: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5340: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
5350: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
5380: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
5390: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
53a0: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
53b0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
53c0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
53d0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
53e0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
53f0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
5400: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
5410: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
5420: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
5430: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
5440: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
5450: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
5460: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
5470: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
5480: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
5490: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
54a0: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
54b0: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
54c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
54d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
54e0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
54f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
5500: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
5510: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
5520: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
5530: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
5540: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
5550: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
5560: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
5570: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
5580: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
5590: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
55a0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
55b0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
55c0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
55d0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
55e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
55f0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
5600: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
5610: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
5620: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
5630: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
5640: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
5650: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
5660: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
5670: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
5680: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
5690: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
56a0: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
56b0: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
56c0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
56d0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
56e0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
56f0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
5700: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
5710: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
5720: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
5730: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
5740: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
5750: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
5760: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
5770: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
5780: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
5790: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
57a0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
57b0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
57c0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
57d0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
57e0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
57f0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
5800: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
5810: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
5820: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
5830: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
5840: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
5850: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
5860: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
5870: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
5880: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
5890: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
58a0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
58b0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
58c0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
58d0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
58e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
58f0: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
5900: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20  ager->errCode.  
5910: 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61      || (pPg->fla
5920: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
5930: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
5940: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5950: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5960: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
5970: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
5980: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
5990: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
59a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
59b0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
59c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
59d0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
59e0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
59f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a00: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5a10: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5a20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5a30: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
5a40: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
5a50: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
5a60: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
5a70: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
5a80: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
5a90: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
5aa0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
5ab0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
5ac0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
5ad0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
5ae0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
5af0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
5b00: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
5b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b20: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
5b30: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
5b40: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
5b50: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
5b60: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
5b70: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
5b80: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
5b90: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
5ba0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
5bb0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
5bc0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
5bd0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
5be0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
5bf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5c00: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
5c10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5c20: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
5c30: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
5c40: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
5c50: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
5c60: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
5c70: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
5c80: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
5c90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
5ca0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
5cb0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
5cc0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
5cd0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
5ce0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
5cf0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
5d00: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
5d10: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
5d20: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
5d30: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
5d40: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
5d50: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
5d60: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
5d70: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
5d80: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
5d90: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
5da0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
5db0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
5dc0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
5dd0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
5de0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
5df0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
5e00: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
5e10: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
5e20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5e30: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5e40: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
5e50: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
5e60: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
5e70: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
5e80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
5e90: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
5ea0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
5eb0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
5ec0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
5ed0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
5ee0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5f00: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
5f10: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
5f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5f30: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
5f40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5f50: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
5f60: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
5f70: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5f80: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
5f90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
5fa0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
5fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fc0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
5fd0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
5fe0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
5ff0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
6000: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
6010: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
6020: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
6030: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
6040: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
6050: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
6060: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
6070: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
6080: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6090: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
60a0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
60b0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
60c0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
60d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
60e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
60f0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
6100: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
6110: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6120: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
6130: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
6140: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
6150: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6160: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
6170: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
6180: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
6190: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
61a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
61b0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
61c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
61d0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
61e0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
61f0: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
6200: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
6210: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
6220: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
6230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6240: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
6250: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
6260: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
6270: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
6280: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
6290: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
62a0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
62b0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
62c0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
62d0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
62e0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
62f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6300: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
6310: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
6320: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
6330: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
6340: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
6350: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
6360: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
6370: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
6380: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
6390: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
63a0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
63b0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
63c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
63d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
63e0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
63f0: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
6400: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
6410: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
6420: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
6430: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
6440: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
6450: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
6460: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
6470: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
6480: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
6490: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
64a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
64b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
64c0: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
64d0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
6500: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
6520: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6540: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
6590: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
65a0: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
65b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
65c0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
65d0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
65e0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
65f0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
6600: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
6610: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6620: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
6630: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6640: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
6650: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
6660: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
6670: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
6680: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
6690: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
66a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66b0: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
66c0: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
66d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
66e0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
66f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6700: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
6710: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6720: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
6730: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6740: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
6750: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
6760: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
6770: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
6780: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
6790: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
67a0: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
67b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
67c0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
67d0: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
67e0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
67f0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6810: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
6820: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
6830: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
6840: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
6850: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
6860: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
6870: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
6880: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
6890: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
68a0: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
68b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
68c0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
68d0: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
68e0: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
68f0: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
6900: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
6910: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
6920: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
6930: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
6940: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
6950: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
6960: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
6970: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6980: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
6990: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
69a0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
69b0: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
69c0: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
69d0: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
69e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
69f0: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
6a00: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
6a10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
6a20: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
6a30: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
6a40: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
6a50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
6a60: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
6a70: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
6a80: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
6a90: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
6aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
6ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
6ac0: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
6ad0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
6ae0: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
6af0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
6b30: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
6b40: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
6b50: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
6b60: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
6b70: 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69     const i64 iLi
6b80: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
6b90: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
6ba0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
6bb0: 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20  e of jsl */..   
6bc0: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
6bd0: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
6be0: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
6bf0: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
6c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6c10: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
6c20: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
6c30: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
6c40: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
6c50: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
6c60: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20  28] = {0};.     
6c70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
6c80: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
6c90: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
6ca0: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
6cb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6cc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
6cd0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
6ce0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6cf0: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
6d00: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
6d10: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
6d20: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
6d30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6d40: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
6d50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
6d60: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
6d70: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
6d80: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
6d90: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
6da0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
6db0: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
6dc0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
6dd0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
6de0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
6df0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
6e00: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
6e10: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
6e20: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
6e30: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
6e40: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
6e50: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
6e60: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
6e70: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
6e80: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
6e90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6ea0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6eb0: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
6ec0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
6ed0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ee0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
6ef0: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
6f00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f10: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
6f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
6f30: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
6f40: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6f50: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
6f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6f70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6f80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6f90: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6fa0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6fb0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
6fc0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
6fd0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6fe0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
6ff0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
7000: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
7010: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
7020: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
7030: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
7040: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
7050: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
7060: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
7070: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
7080: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
7090: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
70a0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
70b0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
70c0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
70d0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
70e0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
70f0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
7100: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
7110: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
7120: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
7130: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
7140: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
7150: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
7160: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
7170: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
7180: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
7190: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
71a0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
71b0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
71c0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
71d0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
71e0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
71f0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
7200: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
7210: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
7220: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7230: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
7240: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
7250: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
7260: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
7270: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
7280: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
7290: 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67  2 nHeader = pPag
72a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
72b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
72c0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
72d0: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
72e0: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
7310: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
7320: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
7330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7350: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7360: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
7370: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
7380: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
7390: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
73a0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
73b0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
73c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
73d0: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
73e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
73f0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
7400: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
7410: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
7420: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
7430: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
7440: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
7450: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
7460: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
7470: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
7480: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
7490: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
74a0: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
74b0: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
74c0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
74d0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
74e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
74f0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
7500: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
7510: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
7520: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
7530: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
7540: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
7550: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
7560: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
7570: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
7580: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
7590: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d  t(pPager);.  mem
75a0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
75b0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
75c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
75d0: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
75e0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
75f0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
7600: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
7610: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
7620: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
7630: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
7640: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
7650: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
7660: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
7670: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
7680: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
7690: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
76a0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
76b0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
76c0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
76d0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
76e0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
76f0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
7700: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
7710: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
7720: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
7730: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
7740: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
7750: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
7760: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
7770: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
7780: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
7790: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
77a0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
77b0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
77c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
77d0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
77e0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
77f0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
7800: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
7810: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
7820: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
7830: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
7840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
7850: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
7860: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
7870: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
7880: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
7890: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
78a0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
78b0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
78c0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
78d0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
78e0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
78f0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
7900: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
7910: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
7920: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
7930: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
7940: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
7950: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
7960: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
7970: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
7980: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
7990: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
79a0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
79b0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
79c0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
79d0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
79e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
79f0: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
7a00: 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67  noSync) || (pPag
7a10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
7a20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
7a30: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
7a40: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
7a50: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7a60: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
7a70: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
7a80: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
7a90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7aa0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7ab0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
7ac0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
7ad0: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
7ae0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7af0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7b00: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   0);.  }..  /* T
7b10: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
7b20: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
7b30: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
7b40: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
7b50: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
7b60: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
7b70: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
7b80: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7b90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7ba0: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
7bb0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
7bc0: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
7bd0: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
7be0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7bf0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7c00: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
7c10: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
7c20: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
7c30: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
7c40: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
7c50: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7c60: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7c70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
7c80: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
7c90: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
7ca0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
7cb0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7cc0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7cd0: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
7ce0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7cf0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
7d00: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
7d10: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
7d20: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
7d30: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
7d40: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
7d50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
7d60: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
7d70: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
7d80: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
7d90: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
7da0: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
7db0: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
7dc0: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
7dd0: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
7de0: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
7df0: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
7e00: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7e10: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
7e20: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
7e30: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
7e40: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
7e50: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
7e60: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
7e70: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
7e80: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
7e90: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
7ea0: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
7eb0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7ec0: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
7ed0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
7ee0: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
7ef0: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
7f00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
7f10: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
7f20: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
7f30: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
7f40: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
7f50: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
7f60: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
7f70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
7f80: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
7f90: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
7fa0: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
7fb0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
7fc0: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
7fd0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
7fe0: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
7ff0: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
8000: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
8010: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
8020: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
8030: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
8040: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
8050: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
8060: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
8070: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
8080: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
8090: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
80a0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
80b0: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
80c0: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
80d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
80e0: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
80f0: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
8100: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
8110: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
8120: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
8130: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
8140: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
8150: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
8160: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
8170: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
8180: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
8190: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
81a0: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
81b0: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
81c0: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
81d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
81e0: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
81f0: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
8200: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
8210: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
8220: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
8230: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
8240: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
8250: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
8260: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
8270: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
8280: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
8290: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
82a0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
82b0: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
82c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
82d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
82e0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
82f0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
8300: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8320: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
8330: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
8340: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
8350: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
8360: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
8370: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
8380: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8390: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
83a0: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20  al.** file. The 
83b0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
83c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
83d0: 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
83e0: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  .** pPager->jour
83f0: 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d  nalOff. See comm
8400: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
8410: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
8420: 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64  Hdr() for.** a d
8430: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
8440: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8450: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
8460: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
8470: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
8480: 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74  y, *pNRec is set
8490: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
84a0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
84b0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
84c0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62   header and *pDb
84d0: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
84e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
84f0: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
8500: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
8510: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
8520: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
8530: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
8540: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
8550: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
8560: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
8570: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
8580: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
8590: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
85a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
85b0: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
85c0: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
85d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
85e0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
85f0: 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53  *pNRec and *PDbS
8600: 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ize are undefine
8610: 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  d.  If JOURNAL_H
8620: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
8630: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
8640: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
8650: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
8660: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
8670: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8680: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
8690: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
86b0: 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
86c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
86d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
86e0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
86f0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
8700: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
8710: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
8720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8730: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
8740: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
8750: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
8760: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
8770: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
8780: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
8790: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
87a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
87d0: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
87e0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
87f0: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
8800: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
8810: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
8820: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8840: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
8850: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
8860: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
8870: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
8880: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
8890: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
88a0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
88b0: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
88c0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
88d0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
88e0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
88f0: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
8900: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
8910: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
8920: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
8930: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
8940: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
8950: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
8960: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
8970: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
8980: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
8990: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
89a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
89b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
89c0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
89d0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
89e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
89f0: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
8a00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
8a10: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
8a20: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
8a30: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8a40: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
8a50: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
8a60: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
8a70: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
8a80: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
8a90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
8aa0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
8ab0: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
8ac0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
8ad0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
8ae0: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
8af0: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
8b00: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
8b10: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
8b20: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
8b30: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
8b40: 72 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20  rOff);.  if( rc 
8b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
8b60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63  ;.  }.  if( memc
8b70: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8b80: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
8b90: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
8ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8bb0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f  E_DONE;.  }..  /
8bc0: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
8bd0: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
8be0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
8bf0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
8c00: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
8c10: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
8c20: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
8c30: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
8c40: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
8c50: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
8c60: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
8c70: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
8c80: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
8c90: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
8ca0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
8cb0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
8cc0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
8cd0: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
8ce0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
8cf0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
8d00: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
8d10: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
8d20: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
8d30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
8d40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
8d50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
8d60: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
8d70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8d80: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
8d90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
8db0: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
8dc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
8dd0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
8de0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
8df0: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
8e00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8e10: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
8e20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8e30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8e40: 31 36 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20  16 iPageSize16; 
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8e60: 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65  opy of iPageSize
8e70: 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61   in 16-bit varia
8e80: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ble */..    /* R
8e90: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
8ea0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
8eb0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8ec0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
8ed0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
8ee0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8ef0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
8f00: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
8f10: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
8f20: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
8f30: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
8f40: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
8f50: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
8f60: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
8f70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8f80: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
8f90: 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
8fa0: 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
8fb0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
8fc0: 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
8fd0: 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
8fe0: 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
8ff0: 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
9000: 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
9010: 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
9020: 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
9030: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
9040: 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
9050: 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
9060: 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
9070: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
9080: 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
9090: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
90a0: 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
90c0: 53 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20  SectorSize<512. 
90d0: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
90e0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
90f0: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
9100: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
9110: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
9120: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
9130: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
9140: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
9150: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
9160: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
9170: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
9180: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
9190: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
91a0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
91b0: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
91c0: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
91d0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
91e0: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
91f0: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
9200: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
9210: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
9220: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
9230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
9240: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
9250: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9260: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
9270: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
9280: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9290: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
92a0: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
92b0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
92c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
92d0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
92e0: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
92f0: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
9300: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
9310: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
9320: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
9330: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
9340: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
9350: 20 20 20 20 69 50 61 67 65 53 69 7a 65 31 36 20      iPageSize16 
9360: 3d 20 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  = (u16)iPageSize
9370: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
9380: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
9390: 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61 67  ze(pPager, &iPag
93a0: 65 53 69 7a 65 31 36 29 3b 0a 20 20 20 20 74 65  eSize16);.    te
93b0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
93c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73  TE_OK );.    ass
93d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
93e0: 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31  OK || iPageSize1
93f0: 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a  6==(u16)iPageSiz
9400: 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  e );..    /* Upd
9410: 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
9420: 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
9430: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
9440: 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
9450: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
9460: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
9470: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
9480: 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
9490: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
94a0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
94b0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
94c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
94d0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
94e0: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
94f0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
9500: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
9510: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
9520: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
9530: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
9540: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
9550: 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
9560: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9570: 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
9580: 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
9590: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
95a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
95b0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
95c0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
95d0: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
95e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
95f0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
9600: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
9610: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
9620: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
9630: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
9640: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9650: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
9660: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
9670: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
9680: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
9690: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
96a0: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
96c0: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
96d0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
96e0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
96f0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
9700: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
9710: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
9720: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
9730: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
9740: 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
9750: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9760: 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
9770: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
9780: 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
9790: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
97a0: 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
97b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
97c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
97d0: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
97e0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
97f0: 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
9800: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
9810: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
9820: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
9830: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
9840: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
9850: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
9860: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
9870: 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
9880: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
9890: 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
98a0: 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
98b0: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
98c0: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
98d0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
98e0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
98f0: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
9900: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
9910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
9920: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
9930: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
9940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9950: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9980: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9990: 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99b0: 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
99c0: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
99d0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
9a00: 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
9a10: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
9a20: 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9a40: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
9a50: 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
9a60: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
9a90: 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
9aa0: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
9ab0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
9ac0: 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67  aster.   || pPag
9ad0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9ae0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9af0: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c  DE_MEMORY .   ||
9b00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9b10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9b20: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29  NALMODE_OFF .  )
9b30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9b40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
9b50: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
9b60: 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 1;.  assert( i
9b70: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9b80: 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  d) );..  /* Calc
9b90: 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68  ulate the length
9ba0: 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68   in bytes and th
9bb0: 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d  e checksum of zM
9bc0: 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e  aster */.  for(n
9bd0: 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65  Master=0; zMaste
9be0: 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73  r[nMaster]; nMas
9bf0: 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ter++){.    cksu
9c00: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  m += zMaster[nMa
9c10: 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster];.  }..  /*
9c20: 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
9c30: 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
9c40: 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
9c50: 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
9c60: 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
9c70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9c80: 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
9c90: 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
9ca0: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
9cb0: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
9cc0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
9cd0: 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
9ce0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
9cf0: 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
9d00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9d10: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
9d20: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
9d30: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
9d40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9d50: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
9d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d70: 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20  data to the end 
9d80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
9d90: 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ile. If.  ** an 
9da0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
9db0: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
9dc0: 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
9dd0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30  r..  */.  if( (0
9de0: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
9df0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
9e00: 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45  d, iHdrOff, PAGE
9e10: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
9e20: 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  )))).   || (0 !=
9e30: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
9e40: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
9e50: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73  d, zMaster, nMas
9e60: 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29  ter, iHdrOff+4))
9e70: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
9e80: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
9e90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9ea0: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20  rOff+4+nMaster, 
9eb0: 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c  nMaster))).   ||
9ec0: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9ed0: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9ee0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
9ef0: 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d  nMaster+4, cksum
9f00: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f10: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f20: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9f30: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
9f40: 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d   8, iHdrOff+4+nM
9f50: 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
9f60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9f70: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
9f80: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
9f90: 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65  ter+20);.  pPage
9fa0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
9fb0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a  Pager->noSync;..
9fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9fd0: 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
9fe0: 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
9ff0: 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
a000: 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
a010: 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
a020: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a030: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
a040: 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
a050: 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
a060: 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
a070: 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
a080: 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
a090: 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
a0a0: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
a0b0: 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
a0c0: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
a0d0: 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
a0e0: 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
a0f0: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
a100: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
a110: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
a120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
a130: 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
a140: 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
a150: 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
a160: 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
a170: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
a180: 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
a190: 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
a1a0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c  .  */ .  if( SQL
a1b0: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
a1c0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a1d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
a1e0: 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a  nlSize)).   && j
a1f0: 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  rnlSize>pPager->
a200: 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a  journalOff.  ){.
a210: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a220: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
a230: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
a240: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d  journalOff);.  }
a250: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a260: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
a270: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
a280: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
a290: 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75  age number. Retu
a2a0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
a2b0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
a2c0: 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65  ULL if the reque
a2d0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
a2e0: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
a2f0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
a300: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
a310: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
a320: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
a330: 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
a360: 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  alue */..  /* It
a370: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
a380: 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50   for a call to P
a390: 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74  cacheFetch() wit
a3a0: 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20  h createFlag==0 
a3b0: 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69  to.  ** fail, si
a3c0: 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74  nce no attempt t
a3d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d  o allocate dynam
a3e0: 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ic memory will b
a3f0: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28  e made..  */.  (
a400: 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63  void)sqlite3Pcac
a410: 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
a420: 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
a430: 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &p);.  return 
a440: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  p;.}../*.** Unle
a450: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
a460: 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  in error-state, 
a470: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
a480: 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a  emory pages. If.
a490: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ** the pager is 
a4a0: 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  in error-state, 
a4b0: 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
a4c0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
a4d0: 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77   TODO: Why can w
a4e0: 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20  e not reset the 
a4f0: 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65  pager while in e
a500: 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73  rror state?.*/.s
a510: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
a520: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
a530: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c  ager){.  if( SQL
a540: 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e  ITE_OK==pPager->
a550: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73  errCode ){.    s
a560: 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
a570: 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
a580: 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kup);.    sqlite
a590: 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
a5a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
a5b0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
a5c0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
a5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
a5e0: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
a5f0: 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
a600: 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
a610: 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
a620: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
a630: 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
a640: 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
a650: 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
a660: 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
a670: 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
a680: 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
a690: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
a6a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
a6b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50  eAllSavepoints(P
a6c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a6d0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
a6e0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
a6f0: 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  or for looping t
a700: 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61  hrough Pager.aSa
a710: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72  vepoint */.  for
a720: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
a730: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
a740: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a750: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
a760: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a770: 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
a780: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
a790: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
a7a0: 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49  Mode || sqlite3I
a7b0: 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
a7c0: 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
a7d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
a7e0: 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
a7f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
a800: 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
a810: 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
a820: 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
a830: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
a840: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
a850: 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
a860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
a870: 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
a880: 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
a890: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
a8a0: 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
a8b0: 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
a8c0: 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
a8d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
a8e0: 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
a8f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
a900: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
a910: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
a920: 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
a930: 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
a940: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
a950: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a980: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
a990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
a9a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
a9b0: 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
a9c0: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
a9d0: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
a9e0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
a9f0: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
aa00: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
aa10: 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
aa20: 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
aa30: 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
aa40: 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
aa50: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
aa60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
aa70: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
aa80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
aa90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
aaa0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
aab0: 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
aac0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
aad0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
aae0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
aaf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab00: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
ab10: 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65  pager.** is in e
ab20: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
ab30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
ab40: 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
ab50: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
ab60: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
ab70: 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63  nts of .** the c
ab80: 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74  ache and reset t
ab90: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
aba0: 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  re internal stat
abb0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  e. If there is.*
abc0: 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  * an open journa
abd0: 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  l-file, then the
abe0: 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61   next time a sha
abf0: 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  red-lock is obta
ac00: 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70  ined.** on the p
ac10: 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68  ager file (by th
ac20: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
ac30: 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c  process), it wil
ac40: 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20  l be.** treated 
ac50: 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
ac60: 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
ac70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ac80: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
ac90: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
aca0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
acb0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
acc0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ace0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
acf0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
ad00: 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
ad10: 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
ad20: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
ad30: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f  e lock..    ** O
ad40: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
ad50: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
ad60: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
ad70: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
ad80: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
ad90: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
ada0: 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
adb0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
adc0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
add0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
ade0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
adf0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
ae00: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
ae10: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  al = 0;.    rele
ae20: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
ae30: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
ae40: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
ae50: 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62   unlocked, someb
ae60: 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63  ody else might c
ae70: 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20  hange it. The.  
ae80: 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72    ** values stor
ae90: 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69  ed in Pager.dbSi
aea0: 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65  ze etc. might be
aeb0: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a  come invalid if.
aec0: 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70      ** this happ
aed0: 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c  ens. TODO: Reall
aee0: 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20  y, this doesn't 
aef0: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
af00: 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20  ed.    ** until 
af10: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
af20: 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69  er check fails i
af30: 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n pagerSharedLoc
af40: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
af50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
af60: 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63  lid = 0;..    rc
af70: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
af80: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
af90: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
afa0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
afb0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
afc0: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
afd0: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
afe0: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49  ager))..    /* I
aff0: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
b000: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
b010: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b020: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
b030: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
b040: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
b050: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
b060: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
b070: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
b080: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
b090: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
b0a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
b0b0: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
b0c0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
b0d0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b0e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b0f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b100: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b110: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b120: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
b130: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
b140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
b150: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
b160: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
b170: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
b180: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d  ER_UNLOCK;.  }.}
b190: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b1a0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
b1b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
b1c0: 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72  OERR, CORRUPT or
b1d0: 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d   FULL error.** m
b1e0: 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
b1f0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
b200: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
b210: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
b220: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
b230: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
b240: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
b250: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b260: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
b270: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
b280: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
b290: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
b2a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
b2b0: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
b2c0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
b2d0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b2e0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
b2f0: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
b300: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
b310: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
b320: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
b330: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
b340: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
b350: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
b360: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
b370: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
b380: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
b390: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
b3a0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
b3b0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
b3c0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
b3d0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
b3e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b3f0: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
b400: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
b410: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
b420: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
b430: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
b440: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
b450: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b460: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
b470: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
b480: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
b490: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b4a0: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
b4b0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
b4c0: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
b4d0: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
b4e0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
b4f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
b500: 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
b510: 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
b520: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
b530: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b540: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
b550: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
b560: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
b570: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
b580: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
b590: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
b5a0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
b5b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b5c0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
b5d0: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
b5e0: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
b5f0: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
b600: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
b610: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
b620: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
b630: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
b640: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20  SQLITE_CORRUPT. 
b650: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b660: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
b670: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
b680: 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
b690: 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  K .     && sqlit
b6a0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
b6b0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
b6c0: 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
b6d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
b6e0: 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e  er is already un
b6f0: 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67  locked, call pag
b700: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20  er_unlock() now 
b710: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  to.      ** clea
b720: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
b730: 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61  e and ensure tha
b740: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
b750: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63  e is .      ** c
b760: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
b770: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b780: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
b790: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
b7a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b7b0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b7c0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b7d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b7e0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b7f0: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b800: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
b810: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
b820: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b830: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
b840: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
b850: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
b860: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
b870: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
b880: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
b890: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
b8a0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
b8b0: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
b8c0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
b8d0: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
b8e0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
b8f0: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
b900: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
b910: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
b920: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
b930: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
b940: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
b950: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
b960: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
b970: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
b980: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
b990: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
b9a0: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
b9b0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
b9c0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
b9d0: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
b9e0: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
b9f0: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
ba00: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
ba10: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
ba20: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
ba30: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
ba40: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
ba50: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
ba60: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
ba70: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
ba80: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
ba90: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
baa0: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
bab0: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
bac0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
bad0: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
bae0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
baf0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bb00: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
bb10: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
bb20: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bb30: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
bb40: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
bb50: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
bb60: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
bb70: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
bb80: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
bb90: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
bba0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
bbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bbc0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
bbd0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
bbe0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
bbf0: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
bc00: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
bc10: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
bc20: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
bc30: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
bc40: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
bc50: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
bc60: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
bc70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bc80: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
bc90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bca0: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
bcb0: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
bcc0: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
bcd0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
bce0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
bcf0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bd00: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
bd10: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
bd20: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
bd30: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
bd40: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
bd50: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
bd60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
bd70: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
bd80: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
bd90: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
bda0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
bdb0: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
bdc0: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
bdd0: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
bde0: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
bdf0: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
be00: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
be10: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
be20: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
be30: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
be40: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
be50: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
be60: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
be70: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
be80: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
be90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
bea0: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
beb0: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
bec0: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
bed0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bee0: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
bef0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
bf00: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
bf10: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
bf20: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
bf30: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
bf40: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bf50: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
bf60: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
bf70: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
bf80: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
bf90: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
bfa0: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
bfb0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
bfc0: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
bfd0: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
bfe0: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
bff0: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
c000: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
c010: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
c020: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c030: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
c040: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
c050: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c060: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
c070: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
c080: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
c090: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c0a0: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
c0b0: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
c0c0: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
c0d0: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
c0e0: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
c0f0: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
c100: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
c110: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
c120: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
c130: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
c140: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
c150: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
c160: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
c170: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
c180: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c190: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c1a0: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
c1b0: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
c1c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c1d0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
c1e0: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
c1f0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
c200: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
c210: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
c220: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
c230: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c240: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
c250: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c260: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
c270: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
c280: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
c290: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
c2a0: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
c2b0: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
c2c0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
c2d0: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
c2e0: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
c2f0: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
c300: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
c310: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
c320: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
c330: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
c340: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
c350: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
c360: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
c370: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
c380: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
c390: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
c3a0: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
c3b0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
c3c0: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
c3d0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c3e0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
c3f0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c400: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c410: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
c420: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
c430: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
c440: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
c450: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
c460: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
c470: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
c480: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c490: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
c4a0: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
c4b0: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
c4c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c4d0: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
c4e0: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
c4f0: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
c500: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c510: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
c520: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
c530: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
c540: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
c550: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
c560: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
c570: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
c580: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
c590: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
c5a0: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c5b0: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
c5c0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c5d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c5e0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c5f0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
c600: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
c610: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c620: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c630: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
c640: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
c650: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
c660: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c670: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
c680: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
c690: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c6a0: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
c6b0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c6c0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c6e0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
c6f0: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
c700: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
c710: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c720: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
c730: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
c740: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
c750: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20  ager->jfd) ){.. 
c760: 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72     /* TODO: Ther
c770: 65 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65  e's a problem he
c780: 72 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  re if a journal-
c790: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
c7a0: 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a  in MEMORY.    **
c7b0: 20 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74   mode and then t
c7c0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
c7d0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52  is changed to TR
c7e0: 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53  UNCATE or PERSIS
c7f0: 54 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20  T.    ** during 
c800: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
c810: 20 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c   This code shoul
c820: 64 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  d be changed to 
c830: 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68  assume.    ** th
c840: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
c850: 6f 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ode has not chan
c860: 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72  ged since the tr
c870: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20  ansaction was.  
c880: 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e    ** started. An
c890: 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  d the sqlite3Pag
c8a0: 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20  erJournalMode() 
c8b0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
c8c0: 62 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  be.    ** change
c8d0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
c8e0: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
c8f0: 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f  case too..    */
c900: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
c910: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
c920: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
c930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
c940: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
c950: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
c960: 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f        int isMemo
c970: 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  ryJournal = sqli
c980: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
c990: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c9a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c9b0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
c9c0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65  .      if( !isMe
c9d0: 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  moryJournal ){. 
c9e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c9f0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
ca00: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
ca10: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
ca20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ca30: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
ca40: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ca50: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
ca60: 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
ca70: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ca80: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
ca90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
caa0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
cab0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cac0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
cad0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
cae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
caf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cb00: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
cb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
cb20: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
cb30: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
cb40: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
cb50: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
cb60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
cb70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
cb80: 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20  SIST.    ){.    
cb90: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
cba0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
cbb0: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
cbc0: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
cbd0: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
cbe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cbf0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
cc00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
cc10: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
cc20: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
cc30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cc40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
cc50: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
cc60: 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73  || rc );.      s
cc70: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
cc80: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
cc90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cca0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
ccb0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
ccc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ccd0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
cce0: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
ccf0: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
cd00: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
cd10: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
cd20: 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65  PAGES.    sqlite
cd30: 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
cd40: 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
cd50: 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
cd60: 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66  agehash);.#endif
cd70: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ..    sqlite3Pca
cd80: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
cd90: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
cda0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
cdb0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
cdc0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
cdd0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cde0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  al = 0;.    pPag
cdf0: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
ce00: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
ce10: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
ce20: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
ce30: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
ce40: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
ce50: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
ce60: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
ce70: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
ce80: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
ce90: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
cea0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
ceb0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
cec0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
ced0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
cee0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
cef0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
cf00: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cf10: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
cf20: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
cf30: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
cf40: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
cf50: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
cf60: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
cf70: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
cf80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
cf90: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
cfa0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
cfb0: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
cfc0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
cfd0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
cfe0: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
cff0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
d000: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
d010: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
d020: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
d030: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
d040: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
d050: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
d060: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
d070: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
d080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
d090: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
d0a0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
d0b0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
d0c0: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
d0d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
d0e0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
d0f0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
d100: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
d110: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
d120: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
d130: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
d140: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
d150: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
d160: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
d170: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
d180: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
d190: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
d1a0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
d1b0: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
d1c0: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
d1d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d1e0: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
d1f0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
d200: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
d210: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
d220: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
d230: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
d240: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
d250: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
d260: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
d270: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
d280: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
d290: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
d2a0: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d2b0: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d2c0: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d2d0: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
d2e0: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
d2f0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
d300: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
d310: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
d320: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
d330: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
d340: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
d350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
d360: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
d370: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
d380: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
d390: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
d3a0: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
d3b0: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
d3c0: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
d3d0: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
d3e0: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
d3f0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
d400: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
d410: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
d420: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
d430: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
d440: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
d450: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
d460: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
d470: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d480: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
d490: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
d4a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d4b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
d4c0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d4d0: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d4e0: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
d510: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d520: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
d530: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
d540: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
d550: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
d560: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
d570: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
d580: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
d590: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
d5a0: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
d5b0: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
d5c0: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
d5d0: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
d5e0: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
d5f0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d600: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
d610: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
d620: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
d630: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
d640: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
d650: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d660: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
d670: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
d680: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
d690: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d6a0: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
d6b0: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
d6c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
d6d0: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
d6e0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
d6f0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
d700: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
d710: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
d720: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
d730: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
d740: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
d750: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
d760: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
d770: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
d780: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d790: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
d7a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
d7b0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
d7c0: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
d7d0: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
d7e0: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d7f0: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
d800: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
d810: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
d820: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
d830: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d840: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
d850: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
d860: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
d870: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
d880: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
d890: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
d8a0: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
d8b0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
d8c0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
d8d0: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
d8e0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
d8f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
d900: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
d910: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
d920: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
d930: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d940: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d950: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
d960: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
d970: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
d980: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
d990: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
d9a0: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
d9b0: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
d9c0: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d9d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
d9e0: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
d9f0: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
da00: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
da10: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
da20: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
da30: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
da40: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
da50: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
da60: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
da70: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
da80: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
da90: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
daa0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
dab0: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
dac0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
dad0: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
dae0: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
daf0: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
db00: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
db10: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
db20: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
db30: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
db40: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
db50: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
db60: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
db70: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
db80: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
db90: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
dba0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
dbb0: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
dbc0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
dbd0: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
dbe0: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
dbf0: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
dc00: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
dc10: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
dc20: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
dc30: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
dc40: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
dc50: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
dc60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
dc70: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
dc80: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
dc90: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
dca0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
dcb0: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
dcc0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
dcd0: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
dce0: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
dcf0: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
dd00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
dd10: 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c  .  int isUnsync,
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
dd40: 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65  ing from unsynce
dd50: 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  d main journal *
dd60: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
dd70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dd80: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
dd90: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
dda0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  k */.  int isSav
ddb0: 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  epnt,           
ddc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
ddd0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dde0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  lback */.  Bitve
ddf0: 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20  c *pDone        
de00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
de10: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
de20: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
de30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
de40: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
de70: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
de80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
deb0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
dec0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
ded0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
def0: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
df00: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
df10: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
df20: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
df30: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
df40: 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
df50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
df60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
df70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
df80: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
df90: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
dfa0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  al file */..  as
dfb0: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
dfc0: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
dfd0: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
dfe0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
dff0: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
e000: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
e010: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
e020: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
e030: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
e040: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
e050: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
e060: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
e070: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
e080: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
e090: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
e0a0: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
e0b0: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
e0c0: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
e0d0: 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
e0e0: 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
e0f0: 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
e100: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
e110: 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
e120: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
e130: 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  ted */..  /* Rea
e140: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
e150: 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
e160: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e170: 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
e180: 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
e190: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
e1a0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
e1b0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e1c0: 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
e1d0: 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
e1e0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
e1f0: 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
e200: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
e210: 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
e220: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
e230: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e240: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
e250: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
e260: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e270: 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
e280: 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
e2b0: 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
e2c0: 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
e2d0: 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
e2e0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
e2f0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
e300: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
e310: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
e320: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
e330: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
e340: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
e350: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
e360: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
e370: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
e380: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
e390: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
e3a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e3b0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
e3c0: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
e3d0: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
e3e0: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
e3f0: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
e400: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
e410: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
e420: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
e430: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e440: 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
e450: 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
e460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
e470: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
e480: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
e490: 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
e4a0: 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
e4b0: 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
e4c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e4d0: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
e4e0: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
e4f0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
e500: 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
e510: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
e520: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e530: 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
e540: 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
e550: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
e560: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
e570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
e580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e590: 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
e5a0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
e5b0: 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
e5c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e5d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e5e0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
e5f0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e600: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
e610: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e620: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
e630: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
e640: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
e650: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
e660: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
e670: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
e680: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
e690: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
e6a0: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
e6b0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
e6c0: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
e6d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
e6e0: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
e6f0: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
e700: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
e710: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
e720: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
e730: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
e740: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
e750: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e760: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e770: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e780: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e790: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e7a0: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e7b0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e7c0: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e7d0: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e7e0: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e7f0: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e800: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e810: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e820: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e830: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e840: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e850: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e860: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e870: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e880: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e890: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e8a0: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e8b0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
e8c0: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
e8d0: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
e8e0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
e8f0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
e900: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
e910: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
e920: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
e930: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
e940: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
e950: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
e960: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
e970: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
e980: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
e990: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
e9a0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
e9b0: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
e9c0: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
e9d0: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
e9e0: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
e9f0: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
ea00: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
ea10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
ea20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
ea30: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
ea40: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
ea50: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ea60: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ea70: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
ea80: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
ea90: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
eaa0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
eab0: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
eac0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
ead0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
eae0: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
eaf0: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
eb00: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
eb10: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
eb20: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
eb30: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
eb40: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
eb50: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
eb60: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
eb70: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
eb80: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
eb90: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
eba0: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
ebb0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
ebc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ebd0: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
ebe0: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
ebf0: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
ec00: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
ec10: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
ec20: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
ec30: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
ec40: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
ec50: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
ec60: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
ec70: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
ec80: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
ec90: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
eca0: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
ecb0: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
ecc0: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
ecd0: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
ece0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
ecf0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
ed00: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
ed10: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
ed20: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
ed30: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
ed40: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
ed50: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
ed60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
ed70: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
ed80: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
ed90: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
eda0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
edb0: 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
edc0: 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
edd0: 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
ede0: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
edf0: 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
ee10: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
ee20: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
ee30: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
ee40: 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20  ize, aData),.   
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d              (isM
ee60: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
ee70: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ee80: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
ee90: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
eea0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
eeb0: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
eec0: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
eed0: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
eee0: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
eef0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ef00: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ef10: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ef20: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
ef30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ef40: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ef50: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
ef60: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
ef70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
ef80: 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
ef90: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
efa0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
efb0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
efc0: 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
efd0: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
efe0: 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
eff0: 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 61  pBackup, pgno, a
f000: 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Data);.  }else i
f010: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
f020: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
f030: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f040: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
f050: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
f060: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
f070: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
f080: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
f090: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
f0a0: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
f0b0: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
f0c0: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
f0d0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
f0e0: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
f0f0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
f100: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
f110: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f120: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
f130: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
f140: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
f150: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
f160: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
f170: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
f180: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
f190: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
f1a0: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
f1b0: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
f1c0: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
f1d0: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
f1e0: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
f1f0: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
f200: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
f210: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
f220: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
f230: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
f240: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
f250: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
f260: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
f270: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
f280: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
f290: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
f2a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
f2b0: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
f2c0: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
f2d0: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
f2e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
f2f0: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
f300: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f310: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
f320: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
f330: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
f340: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
f350: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
f360: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
f370: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
f380: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
f390: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f3a0: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
f3b0: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
f3c0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
f3d0: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
f3e0: 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
f3f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f400: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f410: 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
f420: 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
f430: 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
f440: 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
f450: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
f460: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
f470: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
f480: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
f490: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
f4a0: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
f4b0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
f4c0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
f4d0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
f4e0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
f4f0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
f500: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
f510: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
f520: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
f530: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f540: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
f550: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
f560: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
f570: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
f580: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
f590: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
f5a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
f5b0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
f5c0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
f5d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
f5e0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
f5f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f600: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
f610: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
f620: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f630: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
f640: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f650: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
f660: 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
f670: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
f680: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f690: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f6a0: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
f6b0: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
f6c0: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
f6d0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f6e0: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
f6f0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
f700: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
f710: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
f720: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
f730: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
f740: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
f750: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
f760: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
f770: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
f780: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
f790: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
f7a0: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
f7b0: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
f7c0: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
f7d0: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
f7e0: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
f7f0: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
f800: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
f810: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
f820: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
f830: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
f840: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
f850: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
f860: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
f870: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
f880: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
f890: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
f8a0: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
f8b0: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
f8c0: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
f8d0: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
f8e0: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
f8f0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
f900: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
f910: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
f920: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
f930: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
f940: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
f950: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
f960: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
f970: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
f980: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
f990: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
f9a0: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
f9b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
f9c0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
f9d0: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
f9e0: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
f9f0: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
fa00: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
fa10: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
fa20: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
fa30: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
fa40: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
fa50: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fa60: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
fa70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
fa80: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
fa90: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
faa0: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
fab0: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
fac0: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
fad0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
fae0: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
faf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
fb00: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
fb10: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
fb20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
fb30: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
fb40: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
fb50: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
fb60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
fb70: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
fb80: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
fb90: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
fba0: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
fbb0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
fbc0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
fbd0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
fbe0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
fbf0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
fc00: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
fc10: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
fc20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
fc30: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
fc40: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
fc50: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
fc60: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
fc70: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
fc80: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
fc90: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
fca0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
fcb0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
fcc0: 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
fcd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
fce0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
fcf0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
fd00: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
fd10: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  T)./*.** This ro
fd20: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61  utine looks ahea
fd30: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
fd40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
fd50: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
fd60: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
fd70: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74  e next record (t
fd80: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62  he record that b
fd90: 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a  egins at file.**
fda0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
fdb0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61  journalOff) is a
fdc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67   well-formed pag
fdd0: 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  e record consist
fde0: 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69  ing.** of a vali
fdf0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70  d page number, p
fe00: 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62  Page->pageSize b
fe10: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c  ytes of content,
fe20: 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20   followed.** by 
fe30: 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d  a valid checksum
fe40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
fe50: 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  r never needs to
fe60: 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72   know this in or
fe70: 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f  der to do its jo
fe80: 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  b.   This.** rou
fe90: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
fea0: 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65  d from with asse
feb0: 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
fec0: 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73  e() macros..*/.s
fed0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e  tatic int pagerN
fee0: 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
fef0: 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61  Valid(Pager *pPa
ff00: 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ger){.  Pgno pgn
ff10: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
ff20: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
ff30: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
ff40: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
ff50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
ff60: 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  e checksum */.  
ff70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ff80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ff90: 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70  ode from read op
ffa0: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71  erations */.  sq
ffb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
ffc0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
ffd0: 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77  escriptor from w
ffe0: 68 69 63 68 20 77 65 20 61 72 65 20 72 65 61 64  hich we are read
fff0: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
10000 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
10010 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
10020 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  page */..  /* Re
10030 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
10040 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66  er header */.  f
10050 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b  d = pPager->jfd;
10060 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
10070 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ts(fd, pPager->j
10080 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f  ournalOff, &pgno
10090 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
100a0 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
100b0 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
100e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
100f0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
10100 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
10110 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
10120 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10130 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50  */.  if( pgno>(P
10140 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
10150 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  ze ){ return 0; 
10160 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
10170 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10180 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
10190 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  e checksum */.  
101a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
101c0 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  nalOff+pPager->p
101d0 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
101e0 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
101f0 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10200 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10230 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  T*/..  /* Read t
10240 68 65 20 64 61 74 61 20 61 6e 64 20 76 65 72 69  he data and veri
10250 66 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  fy the checksum 
10260 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38  */.  aData = (u8
10270 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
10280 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ace;.  rc = sqli
10290 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44  te3OsRead(fd, aD
102a0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
102b0 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a  eSize, pPager->j
102c0 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20  ournalOff+4);.  
102d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
102e0 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  K ){ return 0; }
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
10320 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
10330 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
10340 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20  cksum ){ return 
10350 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
10360 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20    /*NO_TEST*/.. 
10370 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20 70   /* Reach this p
10380 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65  oint only if the
10390 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a   page is valid *
103a0 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
103b0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
103c0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
103d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
103e0 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  ERAGE_TEST) */..
103f0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
10400 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
10410 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
10420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
10430 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
10440 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
10450 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
10460 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10470 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
10480 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
10490 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
104a0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
104b0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
104c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
104d0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
104e0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
104f0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
10500 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
10510 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
10520 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
10530 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
10540 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
10550 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10560 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
10570 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
10580 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
10590 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
105a0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
105b0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
105c0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
105d0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
105e0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
105f0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
10600 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
10610 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
10620 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
10630 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
10640 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
10650 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
10660 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
10670 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
10680 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
10690 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
106a0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
106b0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
106c0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
106d0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
106e0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
106f0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
10700 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
10710 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
10720 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
10730 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
10740 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10750 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
10760 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
10770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
10780 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
10790 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
107a0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
107b0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
107c0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
107d0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
107e0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
107f0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
10800 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
10810 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
10820 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
10830 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10840 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
10850 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
10860 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
10870 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
10880 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
10890 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
108a0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
108b0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
108c0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
108d0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
108e0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
108f0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
10900 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10910 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
10920 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
10930 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
10940 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
10950 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
10960 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
10970 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
10980 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
10990 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
109a0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
109b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
109c0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
109d0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
109e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
109f0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
10a00 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
10a10 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
10a20 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
10a30 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
10a40 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
10a50 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
10a60 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
10a70 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
10a80 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
10a90 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
10aa0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
10ab0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
10ac0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
10ad0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
10ae0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
10af0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
10b00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
10b10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10b20 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
10b30 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
10b40 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
10b50 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
10b60 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
10b70 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
10b80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
10b90 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
10ba0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
10bb0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
10bc0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10bd0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
10be0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10c10 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10c20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
10c30 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
10c40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10c50 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
10c60 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
10c70 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
10c80 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
10c90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10ca0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
10cb0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
10cc0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
10cd0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ce0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
10cf0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
10d00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
10d10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10d20 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
10d30 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
10d40 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
10d50 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
10d60 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
10d70 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
10d80 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
10d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10da0 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
10db0 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
10dc0 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
10dd0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
10de0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
10df0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
10e00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
10e10 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
10e20 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
10e30 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
10e40 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
10e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
10e60 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
10e70 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
10e80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
10e90 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
10ea0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
10eb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10ec0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
10ed0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
10ee0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
10ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10f00 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
10f10 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73  r_out;..  rc = s
10f20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10f30 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
10f40 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
10f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10f60 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
10f70 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
10f80 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
10f90 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
10fa0 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
10fb0 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20  MasterPtr = 0;. 
10fc0 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74     int nMasterPt
10fd0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
10fe0 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20  name+1;..    /* 
10ff0 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
11000 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11010 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
11020 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
11030 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
11040 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
11050 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
11060 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
11070 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
11080 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
11090 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e  te3Malloc((int)n
110a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
110b0 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
110c0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
110d0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
110e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
110f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
11100 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
11110 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
11120 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
11130 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
11140 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
11150 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
11160 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
11170 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
11180 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
11190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
111a0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
111b0 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
111c0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
111d0 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
111e0 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
111f0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
11200 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
11210 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b       int exists;
11220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11230 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
11240 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
11250 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
11260 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
11270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
11290 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
112a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
112b0 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
112c0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
112d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
112e0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
112f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
11300 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
11310 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
11320 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
11330 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
11340 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
11350 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
11360 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
11370 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
11380 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
11390 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
113a0 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
113b0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
113c0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
113d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
113e0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
113f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11400 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
11410 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
11420 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
11430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11450 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11460 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
11470 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
11480 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
11490 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
114a0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
114b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
114c0 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
114d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
114e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
114f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11500 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11510 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11520 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
11530 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
11540 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
11550 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
11560 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
11570 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
11580 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
11590 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
115a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
115b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
115c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
115d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
115e0 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
115f0 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
11600 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
11610 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
11620 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11630 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11640 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
11650 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
11660 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
11670 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
11680 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
11690 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
116a0 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
116b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
116c0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
116d0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
116e0 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20  urnal) );.  }.  
116f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
11700 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
11710 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
11720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
11730 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
11740 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
11750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
11760 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
11770 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
11780 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
11790 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
117a0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
117b0 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
117c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
117d0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
117e0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
117f0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
11800 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11810 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
11820 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
11830 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
11840 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
11850 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
11860 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
11870 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
11880 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
11890 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
118a0 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
118b0 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
118c0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
118d0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
118e0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
118f0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
11900 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
11910 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
11920 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
11930 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
11940 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
11950 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
11960 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
11970 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
11980 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
11990 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
119a0 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
119b0 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
119c0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
119d0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
119e0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
119f0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
11a00 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
11a10 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
11a20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
11a30 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
11a40 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
11a50 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
11a60 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
11a70 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
11a80 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
11a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
11aa0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
11ab0 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
11ac0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
11ad0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
11ae0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
11af0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
11b00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11b10 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
11b20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
11b30 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
11b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11b50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
11b60 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
11b70 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
11b80 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
11b90 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
11ba0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
11bb0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
11bc0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
11bd0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
11be0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11bf0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11c00 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
11c10 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
11c20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
11c30 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
11c40 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
11c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
11c60 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
11c70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
11c80 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
11c90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
11ca0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
11cb0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
11cc0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
11cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
11ce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11cf0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
11d00 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
11d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11d30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
11d40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
11d50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
11d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11d70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11d80 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
11d90 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
11da0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
11db0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
11dc0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
11dd0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11de0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11df0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
11e00 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
11e10 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
11e20 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
11e30 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
11e40 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
11e50 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
11e60 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
11e70 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
11e80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
11e90 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
11ea0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
11eb0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
11ec0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
11ed0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
11ee0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
11ef0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
11f00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
11f10 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
11f20 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
11f30 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
11f40 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
11f50 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11f60 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
11f70 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
11f80 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69  p to 512 if.** i
11f90 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35  t is less than 5
11fa0 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  12, or rounded d
11fb0 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
11fc0 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
11fd0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11fe0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
11ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12000 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
12010 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12020 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
12030 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
12040 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
12050 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
12060 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
12070 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
12080 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
12090 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
120a0 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
120b0 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
120c0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
120d0 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
120e0 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
120f0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
12100 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
12110 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
12120 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12130 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
12140 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
12150 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
12160 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12170 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
12180 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12190 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66   = 512;.  }.  if
121a0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
121b0 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
121c0 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
121d0 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
121e0 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
121f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12200 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
12210 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
12220 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
12230 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
12240 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
12250 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
12260 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
12270 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
12280 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
12290 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
122a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
122b0 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
122c0 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
122d0 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
122e0 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
122f0 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
12300 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
12310 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12320 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
12330 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
12340 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
12350 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
12360 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
12370 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
12380 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
12390 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
123a0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
123b0 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
123c0 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
123d0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
123e0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
123f0 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
12400 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
12410 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
12420 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
12430 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
12440 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12450 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
12460 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
12470 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
12480 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
12490 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
124a0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
124b0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
124c0 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
124d0 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
124e0 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
124f0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
12500 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
12510 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12520 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12530 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65 2e  s the page case.
12540 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74 65  .**  (7)  4 byte
12550 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12560 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12570 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
12580 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
12590 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
125a0 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
125b0 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
125c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
125d0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
125e0 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20  rnal.).**  (8)  
125f0 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
12600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
12610 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
12620 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
12630 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
12640 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
12650 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
12660 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
12670 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
12680 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
12690 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
126a0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
126b0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
126c0 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
126d0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
126e0 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
126f0 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20   UTF-8..**  (9) 
12700 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
12710 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
12720 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
12730 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12740 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
12750 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
12760 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
12770 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
12780 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
12790 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
127a0 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
127b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
127c0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
127d0 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73 20  e first 8 items 
127e0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
127f0 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
12800 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
12810 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69 74  ce of the 9th it
12820 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
12830 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
12840 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
12850 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
12860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
12870 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
12880 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
12890 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
128a0 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
128b0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
128c0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
128d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
128e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
128f0 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
12900 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
12910 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
12920 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
12930 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
12940 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
12950 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
12960 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12970 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
12980 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
12990 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
129a0 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
129b0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
129c0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
129d0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
129e0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
129f0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
12a00 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
12a10 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
12a20 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
12a30 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
12a40 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
12a50 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
12a60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
12a70 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
12a80 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
12a90 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
12aa0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
12ab0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
12ac0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
12ad0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
12ae0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
12af0 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
12b00 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
12b10 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
12b20 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
12b30 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
12b40 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
12b50 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
12b60 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
12b70 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
12b80 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
12b90 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
12ba0 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
12bb0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
12bc0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
12bd0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
12be0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
12bf0 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
12c00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
12c10 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
12c20 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
12c30 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
12c40 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
12c50 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
12c60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12c70 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
12c80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
12c90 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
12ca0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
12cb0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
12cc0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
12cd0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
12ce0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
12cf0 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
12d00 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
12d10 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
12d20 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
12d30 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
12d40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12d50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
12d60 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
12d70 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
12d80 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
12d90 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
12da0 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
12db0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
12dc0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
12dd0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
12de0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
12df0 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
12e00 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
12e10 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
12e20 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
12e30 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
12e40 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
12e50 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
12e60 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
12e70 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
12e80 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
12e90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
12ea0 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
12eb0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
12ec0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
12ed0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
12ee0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
12ef0 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
12f00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
12f10 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
12f20 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f40 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
12f50 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
12f60 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
12f70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12f80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
12f90 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
12fa0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
12fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fc0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
12fd0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
12fe0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
12ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
13000 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
13010 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
13020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13040 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
13050 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
13060 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
13070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13080 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
13090 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
130a0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
130b0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
130c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
130d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
130e0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
130f0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
13100 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
13110 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
13120 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
13130 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a  ollback */..  /*
13140 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
13150 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
13160 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13170 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
13180 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
13190 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
131a0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
131b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
131c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
131d0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
131e0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
131f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13200 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
13210 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13220 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
13230 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
13240 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
13250 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
13260 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
13270 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
13280 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
13290 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
132a0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
132b0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
132c0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
132d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
132e0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
132f0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
13300 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
13310 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
13320 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
13330 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
13340 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
13350 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
13360 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
13370 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
13380 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
13390 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
133a0 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
133b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
133c0 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
133d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
133e0 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
133f0 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
13400 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
13410 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
13420 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
13430 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
13440 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
13450 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
13460 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
13470 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
13480 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
13490 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
134a0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
134b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
134c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
134d0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
134e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
134f0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
13500 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
13510 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
13520 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
13530 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
13540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13550 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
13560 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
13570 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
13580 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13590 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
135a0 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
135b0 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
135c0 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
135d0 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
135e0 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
135f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
13600 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
13610 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
13620 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
13630 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
13640 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
13650 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e  .    int isUnsyn
13660 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  c = 0;..    /* R
13670 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
13680 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
13690 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
136a0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
136b0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
136c0 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
136d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
136e0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
136f0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
13700 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
13710 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
13720 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
13730 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
13740 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
13750 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
13760 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
13770 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
13780 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13790 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
137a0 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
137b0 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
137c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
137d0 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
137e0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
137f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
13800 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13810 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
13820 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
13830 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
13840 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
13850 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
13860 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
13870 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
13880 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
13890 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
138a0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
138b0 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
138c0 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
138d0 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
138e0 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
138f0 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
13900 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
13910 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
13920 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
13930 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
13940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
13950 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
13960 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13980 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
13990 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
139a0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
139b0 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  )((szJ - JOURNAL
139c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
139d0 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
139e0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
139f0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
13a00 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
13a10 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
13a20 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
13a30 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
13a40 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
13a50 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
13a60 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13a70 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
13a80 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
13a90 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
13aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13ab0 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
13ac0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
13ad0 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
13ae0 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
13af0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13b00 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
13b10 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
13b20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
13b30 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
13b40 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
13b50 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
13b60 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
13b70 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
13b80 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e    ** When rollin
13b90 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75  g back a hot jou
13ba0 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c  rnal, nRec==0 al
13bb0 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20  ways means that 
13bc0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
13bd0 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75  chunk of the jou
13be0 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65  rnal contains ze
13bf0 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72  ro pages to be r
13c00 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74  olled back.  But
13c10 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69  .    ** when doi
13c20 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  ng a ROLLBACK an
13c30 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68  d the nRec==0 ch
13c40 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20  unk is the last 
13c50 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20  chunk in.    ** 
13c60 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  the journal, it 
13c70 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a  means that the j
13c80 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
13c90 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a  tain additional.
13ca0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61      ** pages tha
13cb0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c  t need to be rol
13cc0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61  led back and tha
13cd0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13ce0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68  pages .    ** sh
13cf0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
13d00 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f   based on the jo
13d10 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e  urnal file size.
13d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73 74  .    */.    test
13d30 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26 26  case( nRec==0 &&
13d40 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20 20   !isHot.        
13d50 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13d60 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
13d70 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70  DR_SZ(pPager)!=p
13d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13d90 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  f.         && ((
13da0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
13db0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
13dc0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
13dd0 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26  ))>0.         &&
13de0 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61   pagerNextJourna
13df0 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61  lPageIsValid(pPa
13e00 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ger).    );.    
13e10 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
13e20 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
13e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e40 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13e50 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
13e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
13e70 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
13e80 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
13e90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
13ea0 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
13eb0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
13ec0 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20  isUnsync = 1;.  
13ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
13ee0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
13ef0 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
13f00 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
13f10 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
13f20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
13f30 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
13f40 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
13f50 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
13f60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
13f70 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
13f80 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
13f90 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
13fa0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
13fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13fd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
13fe0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
13ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
14000 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
14010 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
14020 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
14030 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
14040 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
14050 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
14060 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
14070 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
14080 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
14090 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
140a0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
140b0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
140c0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
140d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
140e0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
140f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14100 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14110 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
14120 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63  Pager,1,isUnsync
14130 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
14140 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20  lOff,0,0);.     
14150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
14170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
14180 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
14190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
141a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
141b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
141c0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
141d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
141e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
141f0 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
14200 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
14210 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
14220 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
14230 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
14240 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
14250 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
14260 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
14270 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
14280 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
14290 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
142a0 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
142b0 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
142c0 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
142d0 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
142e0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
142f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
14300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14310 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
14320 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
14330 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14340 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
14350 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
14360 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
14370 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
14380 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
143a0 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
143b0 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
143c0 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
143d0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
143e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
143f0 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
14400 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
14410 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
14420 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
14430 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
14440 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
14450 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
14460 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
14470 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
14480 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
14490 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
144a0 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
144b0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
144c0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
144d0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
144e0 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
144f0 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
14500 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
14510 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
14520 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
14530 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
14540 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
14550 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
14560 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
14570 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
14580 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
14590 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
145a0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
145b0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
145c0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
145d0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
145e0 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
145f0 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
14600 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
14610 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
14620 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
14630 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
14640 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
14650 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
14660 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
14670 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
14680 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
14690 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
146a0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
146b0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
146c0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
146d0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
146e0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
146f0 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
14700 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
14710 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
14720 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
14730 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
14740 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
14750 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
14760 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
14770 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
14780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14790 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
147a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
147b0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
147c0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
147d0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
147e0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
147f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
14800 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14820 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
14830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
14840 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
14850 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14860 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
14870 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
148a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
148b0 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
148c0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
148d0 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
148e0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
148f0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
14900 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
14910 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
14920 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
14930 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
14940 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
14950 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
14960 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
14970 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
14980 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14990 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
149a0 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
149b0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
149c0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
149d0 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
149e0 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
149f0 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
14a00 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
14a10 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
14a20 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
14a30 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
14a40 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
14a50 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
14a60 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
14a70 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
14a80 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
14a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
14aa0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
14ab0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
14ac0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14ad0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
14ae0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
14af0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14b00 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
14b10 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
14b20 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
14b30 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
14b40 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
14b50 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
14b60 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
14b70 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
14b80 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
14b90 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
14ba0 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
14bb0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
14bc0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
14bd0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
14be0 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
14bf0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
14c00 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
14c10 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
14c20 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
14c30 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
14c40 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
14c50 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14c60 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
14c70 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
14c80 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
14c90 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
14ca0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
14cb0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
14cc0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
14cd0 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
14ce0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14cf0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
14d00 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
14d10 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
14d20 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
14d30 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
14d40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
14d50 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
14d60 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
14d70 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
14d80 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
14d90 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
14da0 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
14db0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
14dc0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14dd0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
14de0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14df0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
14e00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
14e10 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
14e20 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14e30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
14e40 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
14e50 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
14e60 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
14e70 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
14e80 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
14e90 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
14ea0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
14eb0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
14ec0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
14ed0 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
14ee0 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
14ef0 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
14f00 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
14f10 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
14f20 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
14f30 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
14f40 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
14f50 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
14f60 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
14f70 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
14f80 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
14f90 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
14fa0 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
14fb0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
14fc0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
14fd0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
14fe0 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
14ff0 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
15000 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15010 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
15020 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
15030 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
15040 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
15050 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
15060 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
15070 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
15080 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
15090 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
150a0 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
150b0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
150c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
150d0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
150e0 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
150f0 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
15100 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
15110 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
15120 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
15130 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
15140 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
15150 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
15160 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
15170 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
15180 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
15190 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
151a0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
151b0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
151c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
151d0 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
151e0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
151f0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
15200 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
15210 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
15220 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
15230 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
15240 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
15250 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15260 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15270 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
15280 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
15290 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
152a0 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
152b0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
152c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
152d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
152e0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
152f0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
15300 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
15310 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
15320 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
15330 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
15340 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
15350 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
15360 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
15370 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
15380 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
15390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
153a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
153b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
153c0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
153d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
153e0 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
153f0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
15400 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
15410 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
15420 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
15430 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
15440 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
15450 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
15460 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20  >dbOrigSize;..  
15470 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
15480 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
15490 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
154a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
154b0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
154c0 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
154d0 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
154e0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
154f0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
15500 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
15510 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
15520 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
15530 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
15540 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
15550 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
15560 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
15570 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
15580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
15590 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
155a0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
155b0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
155c0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
155d0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
155e0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
155f0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
15600 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
15610 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
15620 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
15630 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
15640 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
15650 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
15660 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
15670 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
15680 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
15690 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
156a0 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
156b0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
156c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
156d0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
156e0 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
156f0 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
15700 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
15710 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
15720 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
15730 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
15740 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
15750 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
15760 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
15770 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
15780 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
15790 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
157a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
157b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
157c0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
157d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
157e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
157f0 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26  (pPager, 1, 0, &
15800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15810 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
15820 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15830 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15840 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
15850 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15860 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
15870 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
15880 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15890 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
158a0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
158b0 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
158c0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
158d0 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
158e0 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
158f0 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
15900 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
15910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
15920 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
15930 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
15940 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
15950 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
15960 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
15970 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
15980 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
15990 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
159a0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
159b0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
159c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
159d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
159e0 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
159f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
15a00 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
15a10 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
15a20 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
15a30 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
15a40 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
15a50 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
15a60 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
15a70 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
15a80 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
15a90 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15aa0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15ab0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15ac0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
15ad0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
15ae0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
15af0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
15b00 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
15b10 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
15b20 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
15b30 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15b40 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
15b50 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
15b60 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
15b70 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15b80 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15b90 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
15ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15bb0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
15bc0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15bd0 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
15be0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15bf0 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
15c00 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
15c10 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
15c20 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
15c30 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
15c40 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
15c50 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15c60 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15c70 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15c80 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
15c90 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
15ca0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
15cb0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
15cc0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15ce0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15cf0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
15d00 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15d10 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
15d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15d30 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15d40 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15d50 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15d60 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15d70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15d80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15d90 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
15da0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15db0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
15dc0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
15dd0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
15de0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
15df0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15e00 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
15e10 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
15e20 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
15e30 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
15e40 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
15e50 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
15e60 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
15e70 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
15e80 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
15e90 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
15ea0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
15eb0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
15ec0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
15ed0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15ee0 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
15ef0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
15f00 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
15f10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
15f20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
15f30 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
15f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15f50 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
15f60 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
15f70 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
15f80 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
15f90 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
15fa0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15fb0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
15fc0 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66  ager, 0, 0, &off
15fd0 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
15fe0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
16000 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
16010 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
16020 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
16030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16040 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16050 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
16060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16070 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16080 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
16090 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
160a0 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
160b0 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
160c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
160d0 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
160e0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
160f0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
16100 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
16110 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
16120 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
16130 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
16140 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
16150 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
16160 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16170 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
16180 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
16190 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
161a0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
161b0 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
161c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
161d0 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
161e0 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
161f0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
16200 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
16210 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
16220 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
16230 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
16240 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
16250 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
16260 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
16270 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
16280 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16290 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
162a0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
162b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
162c0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
162d0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
162e0 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
162f0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
16300 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
16310 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
16320 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
16330 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
16340 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
16350 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
16360 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16370 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
16380 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
16390 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
163a0 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
163b0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
163c0 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
163d0 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
163e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
163f0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
16400 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
16410 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
16420 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
16430 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
16440 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16450 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
16460 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16470 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
16480 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
16490 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
164a0 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
164b0 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
164c0 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
164e0 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
164f0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
16500 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
16510 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
16520 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
16530 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
16540 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
16550 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
16560 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
16570 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
16580 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
16590 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
165a0 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
165b0 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
165c0 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
165d0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
165e0 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
165f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16600 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
16610 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
16620 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
16630 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16640 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16650 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
16660 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
16670 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
16680 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
16690 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
166a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
166b0 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
166c0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
166d0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
166e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
166f0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
16700 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
16710 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
16720 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
16730 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
16740 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
16750 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
16760 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
16770 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
16780 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
16790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
167a0 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
167b0 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
167c0 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
167d0 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
167e0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
167f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
16800 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
16810 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
16820 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
16830 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
16840 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16850 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
16860 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16870 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16880 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
16890 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
168a0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
168b0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
168c0 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
168d0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
168e0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
168f0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
16900 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
16910 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
16920 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
16930 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
16940 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
16950 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
16960 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
16970 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
16980 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
16990 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
169a0 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
169b0 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
169c0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
169d0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
169e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
169f0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
16a00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
16a10 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16a20 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
16a30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
16a40 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
16a50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
16a60 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
16a70 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16a80 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
16a90 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
16aa0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
16ab0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
16ac0 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
16ad0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
16ae0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
16af0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
16b00 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
16b10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16b50 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
16b60 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
16b70 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
16b80 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16b90 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
16ba0 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
16bb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16bc0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
16bd0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
16be0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16bf0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
16c00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
16c10 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
16c20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
16c30 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
16c40 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
16c50 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
16c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16c70 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
16c80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
16c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16ca0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
16cb0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
16cc0 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
16cd0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16ce0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
16cf0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
16d00 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
16d10 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16d20 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
16d30 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
16d40 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
16d50 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16d60 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
16d70 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
16d80 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
16d90 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
16da0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16db0 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
16dc0 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
16dd0 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
16de0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
16df0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
16e00 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
16e10 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
16e20 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
16e30 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
16e40 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
16e50 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
16e70 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
16e80 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
16e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ec0 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
16ed0 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
16ee0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
16ef0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
16f00 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
16f10 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
16f20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
16f30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
16f40 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
16f50 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
16f60 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
16f70 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
16f80 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
16f90 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
16fa0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
16fb0 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
16fc0 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
16fd0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
16fe0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
16ff0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
17000 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
17010 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
17020 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
17030 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17040 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
17050 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
17080 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
17090 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
170a0 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
170b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
170c0 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
170d0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
170e0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
170f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17100 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
17110 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
17120 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
17130 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
17140 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
17150 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
17160 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
17170 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
17180 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
17190 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
171a0 68 69 73 20 70 61 67 65 72 2e 20 49 66 20 6e 6f  his pager. If no
171b0 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
171c0 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
171d0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
171e0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
171f0 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 6d 6f  e in cache is mo
17200 64 69 66 69 65 64 20 28 72 65 73 74 6f 72 65 64  dified (restored
17210 29 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  ).** as part of 
17220 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  a transaction or
17230 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
17240 61 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62 61 63  ack. The callbac
17250 6b 20 67 69 76 65 73 20 0a 2a 2a 20 68 69 67 68  k gives .** high
17260 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20 61 6e  er-level code an
17270 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
17280 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
17290 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a  A section to .**
172a0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
172b0 72 65 73 74 6f 72 65 64 20 70 61 67 65 20 64 61  restored page da
172c0 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
172d0 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
172e0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
172f0 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
17300 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20  t)(DbPage*)){.  
17310 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
17320 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
17330 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17340 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
17350 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
17360 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
17370 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
17380 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
17390 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
173a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
173b0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
173c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
173d0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
173e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
173f0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
17400 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
17410 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
17420 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
17430 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
17440 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53  ITE_CORRUPT or S
17450 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
17460 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
17470 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
17480 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
17490 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
174a0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
174b0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
174c0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
174d0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
174e0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
174f0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
17500 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
17510 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
17520 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
17530 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
17540 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
17550 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
17560 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
17570 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
17580 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
17590 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
175a0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
175b0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
175c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
175d0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
175e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
175f0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
17600 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
17610 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
17620 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
17630 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
17640 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
17650 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
17660 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
17670 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
17680 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
17690 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
176a0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
176b0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
176c0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
176d0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
176e0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
176f0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
17700 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
17710 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17720 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
17730 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
17740 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
17750 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
17760 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
17770 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
17780 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
17790 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
177a0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
177b0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
177c0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
177d0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
177e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
177f0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
17800 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
17810 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
17820 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
17830 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
17840 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
17850 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
17860 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
17870 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
17880 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
17890 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65  t rc = pPager->e
178a0 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63  rrCode;.  if( rc
178b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
178c0 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20     u16 pageSize 
178d0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
178e0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
178f0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
17900 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
17910 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
17920 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
17930 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
17940 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
17950 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
17960 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d     && (pPager->m
17970 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
17980 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
17990 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
179a0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
179b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
179c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
179d0 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
179e0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
179f0 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
17a00 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
17a10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17a20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17a40 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17a50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17a60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17a70 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
17a80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
17a90 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
17aa0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
17ab0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
17ac0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
17ad0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17ae0 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
17af0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
17b00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
17b10 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
17b20 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67  Size = (u16)pPag
17b30 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17b40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17b50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17b60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17b70 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
17b80 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
17b90 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
17ba0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
17bb0 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
17bc0 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
17bd0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
17be0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
17bf0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
17c00 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
17c10 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
17c20 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
17c30 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
17c40 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
17c50 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
17c60 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
17c70 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
17c80 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
17c90 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
17ca0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
17cb0 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
17cc0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
17cd0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
17ce0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17cf0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
17d00 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
17d10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
17d20 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
17d30 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
17d40 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
17d50 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
17d60 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
17d70 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
17d80 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
17d90 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
17da0 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
17db0 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
17dc0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
17dd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
17de0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
17df0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
17e00 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
17e10 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
17e20 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17e30 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
17e40 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
17e50 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
17e60 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
17e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
17e80 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
17e90 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
17ea0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
17eb0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
17ec0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
17ed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
17ee0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
17ef0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
17f00 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
17f10 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
17f20 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
17f30 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
17f40 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
17f50 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
17f60 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
17f70 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
17f80 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
17f90 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
17fa0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
17fb0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
17fc0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
17fd0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
17fe0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
17ff0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
18000 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
18010 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
18020 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
18030 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
18040 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
18050 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
18060 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
18070 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
18080 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
18090 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
180a0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
180b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
180c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
180d0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
180e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
180f0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
18100 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
18110 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
18120 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
18130 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
18140 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
18150 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
18160 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18170 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
18180 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
18190 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
181a0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
181b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
181c0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
181d0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
181e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
181f0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
18200 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
18210 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
18220 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
18230 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
18240 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
18250 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
18260 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
18270 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
18280 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
18290 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
182a0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
182b0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
182c0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
182d0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
182e0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
182f0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
18300 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
18310 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
18320 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
18330 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
18340 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
18350 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
18360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18370 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
18380 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
18390 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
183a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
183b0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
183c0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
183d0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
183e0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
183f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
18400 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
18410 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
18420 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
18430 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
18440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
18450 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
18460 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
18470 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
18480 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18490 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73  File );.  if( is
184a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
184b0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
184c0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
184d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
184e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
184f0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
18500 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
18510 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18520 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
18530 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
18540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18550 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18570 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
18580 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18590 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
185a0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
185b0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
185c0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
185d0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
185e0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
185f0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
18600 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
18610 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
18620 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
18630 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
18640 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
18650 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
18660 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
18670 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
18680 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
18690 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
186a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
186b0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
186c0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
186d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
186e0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
186f0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
18700 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
18710 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
18720 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
18730 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
18740 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
18750 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
18760 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
18770 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
18780 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
18790 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
187a0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
187b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
187c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
187d0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
187e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
187f0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
18800 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
18810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18820 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
18830 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
18840 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18850 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
18860 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
18870 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
18880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
18890 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
188a0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
188b0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
188c0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
188d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
188e0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
188f0 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  code. */.  if( p
18900 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
18910 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
18920 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
18930 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
18940 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18950 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18960 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e  e. Store this in
18970 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28   nPage. */.  if(
18980 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
18990 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67  alid ){.    nPag
189a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
189b0 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
189c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
189d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
189e0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  r returned by Os
189f0 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20  FileSize() */.  
18a00 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
18a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
18a20 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
18a30 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
18a40 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20  leSize() */..   
18a50 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
18a60 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
18a70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18a80 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
18a90 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26  n(pPager->fd) &&
18aa0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
18ab0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
18ac0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29  Pager->fd, &n)))
18ad0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
18ae0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
18af0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18b00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
18b10 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
18b20 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
18b30 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a       nPage = 1;.
18b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b50 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
18b60 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  n / pPager->page
18b70 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
18b80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18b90 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
18ba0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18bb0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
18bc0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18bd0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
18be0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
18bf0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
18c00 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
18c10 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
18c20 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
18c30 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
18c40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
18c50 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
18c60 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
18c70 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
18c80 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
18c90 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
18ca0 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
18cb0 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
18cc0 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
18cd0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
18ce0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
18cf0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
18d00 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
18d10 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
18d20 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18d30 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61  OK */.  if( pnPa
18d40 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67  ge ){.    *pnPag
18d50 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
18d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18d70 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  K;.}.../*.** Try
18d80 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
18d90 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
18da0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
18db0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
18dc0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
18dd0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
18de0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
18df0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
18e00 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
18e10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
18e20 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
18e30 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
18e40 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
18e50 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
18e60 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
18e70 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
18e80 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
18e90 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
18ea0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
18eb0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
18ec0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
18ed0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
18ee0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
18ef0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
18f00 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
18f10 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
18f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18f30 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
18f40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
18f50 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
18f60 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
18f70 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
18f80 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
18f90 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
18fa0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
18fb0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
18fc0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18fe0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
18ff0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
19000 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
19010 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19040 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
19050 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
19060 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
19070 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
19080 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
19090 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
190a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
190b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
190c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
190d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
190e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
190f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
19100 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
19110 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
19120 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
19130 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
19140 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
19150 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
19160 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19170 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
19180 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
19190 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  alid==0 );..  /*
191a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
191b0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
191c0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
191d0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
191e0 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
191f0 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
19200 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
19210 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
19220 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
19230 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
19240 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
19250 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
19260 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
19270 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
19280 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
19290 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
192a0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  te>=locktype).  
192b0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
192c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
192d0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
192e0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
192f0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
19300 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
19310 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b  RESERVED && lock
19320 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c  type==PAGER_EXCL
19330 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69  USIVE).  );..  i
19340 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
19350 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
19360 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
19380 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
19390 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
193a0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
193b0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
193c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
193d0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
193e0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
193f0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
19400 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
19410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19420 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
19430 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
19440 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
19450 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
19460 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
19470 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
19480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19490 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
194a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
194b0 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
194c0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
194d0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
194e0 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
194f0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
19500 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
19510 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
19520 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
19530 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
19540 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
19550 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
19560 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
19570 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
19580 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
19590 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
195a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
195b0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
195c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
195d0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
195e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
195f0 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
19600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19610 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
19620 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19630 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
19640 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50  RESERVED );.  pP
19650 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
19660 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Page;.}../*.** S
19670 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
19680 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
19690 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
196a0 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
196b0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
196c0 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
196d0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
196e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
196f0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
19700 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
19710 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
19720 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
19730 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
19740 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
19750 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
19760 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
19770 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
19780 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
19790 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
197a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
197b0 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
197c0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
197d0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
197e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
197f0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
19800 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
19810 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
19820 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
19830 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
19840 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
19850 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
19860 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
19870 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
19880 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
19890 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
198a0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
198b0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
198c0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
198d0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
198e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69  r *pPager){.  di
198f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
19900 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
19910 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
19920 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61  nMalloc();.  pPa
19930 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
19940 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
19950 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
19960 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
19970 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
19980 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
19990 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
199a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
199b0 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  et Pager.journal
199c0 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68  Hdr to -1 for th
199d0 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65  e benefit of the
199e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
199f0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ) .    ** call w
19a00 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65  hich may be made
19a10 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
19a20 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
19a30 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20  ack(). If it.   
19a40 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74   ** is not -1, t
19a50 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64  hen the unsynced
19a60 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f   portion of an o
19a70 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
19a80 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70   may.    ** be p
19a90 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
19aa0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
19ab0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
19ac0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20   occurs while.  
19ad0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
19ae0 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
19af0 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  base may become 
19b00 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a  corrupt..    */.
19b10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19b20 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20  nalHdr = -1;.   
19b30 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
19b40 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
19b50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
19b60 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
19b70 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
19b80 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
19b90 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
19ba0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
19bb0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
19bc0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
19bd0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
19be0 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
19bf0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
19c00 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
19c10 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
19c20 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ace);.  sqlite3P
19c30 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
19c40 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
19c50 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
19c60 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
19c70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
19c80 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
19c90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
19ca0 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
19cb0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
19cc0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
19cd0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
19ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19cf0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
19d00 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
19d10 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
19d20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
19d30 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
19d40 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
19d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
19d60 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
19d70 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
19d80 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
19d90 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
19da0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
19db0 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
19dc0 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
19dd0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
19de0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
19df0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
19e00 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
19e10 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
19e20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19e30 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
19e40 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
19e50 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
19e60 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
19e70 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
19e80 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
19e90 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
19ea0 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
19eb0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
19ec0 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
19ed0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
19ee0 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
19ef0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
19f00 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20  s not set, then 
19f10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19f20 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68   a.** no-op. Oth
19f30 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
19f40 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
19f50 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
19f60 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74  al-mode.** and t
19f70 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
19f80 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
19f90 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
19fa0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
19fb0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
19fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
19fd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
19fe0 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
19ff0 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
1a000 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
1a010 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
1a020 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
1a030 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
1a040 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
1a050 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
1a060 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
1a070 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
1a080 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
1a090 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
1a0a0 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
1a0b0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1a0c0 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
1a0d0 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
1a0e0 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
1a0f0 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
1a100 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
1a110 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
1a120 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
1a130 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
1a140 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a150 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
1a160 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
1a170 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
1a180 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
1a190 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
1a1a0 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
1a1b0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
1a1c0 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
1a1d0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
1a1e0 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
1a1f0 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
1a200 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
1a210 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
1a220 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
1a230 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
1a240 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
1a250 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
1a260 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1a270 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
1a280 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
1a290 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
1a2a0 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
1a2b0 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
1a2c0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
1a2d0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *   }.**.** The 
1a2e0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1a2f0 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65 20  lag is never be 
1a300 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  set for temporar
1a310 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a  y files, or any.
1a320 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e  ** file operatin
1a330 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
1a340 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  e (Pager.noSync 
1a350 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29  set to non-zero)
1a360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1a370 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
1a380 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
1a390 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
1a3a0 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
1a3b0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
1a3c0 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
1a3d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
1a3e0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
1a3f0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
1a400 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1a410 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
1a420 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1a430 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1a440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
1a450 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
1a460 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1a470 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1a480 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1a490 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a4a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1a4b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
1a4c0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1a4d0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
1a4e0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1a510 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  n code */.      
1a520 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
1a530 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1a540 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1a550 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
1a560 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a570 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1a580 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
1a590 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1a5a0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
1a5b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  .        /* Vari
1a5c0 61 62 6c 65 20 69 4e 52 65 63 4f 66 66 73 65 74  able iNRecOffset
1a5d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1a5e0 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
1a5f0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
1a600 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52 65 63    ** of the nRec
1a610 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
1a620 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
1a630 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
1a640 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  er..        ** T
1a650 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62  his field will b
1a660 65 20 75 70 64 61 74 65 64 20 66 6f 6c 6c 6f 77  e updated follow
1a670 69 6e 67 20 74 68 65 20 78 53 79 6e 63 28 29 20  ing the xSync() 
1a680 6f 70 65 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  operation.      
1a690 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
1a6a0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
1a6b0 20 20 20 20 20 69 36 34 20 69 4e 52 65 63 4f 66       i64 iNRecOf
1a6c0 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
1a6d0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
1a6e0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1a6f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
1a700 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
1a710 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
1a720 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
1a730 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
1a740 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1a750 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
1a760 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
1a770 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
1a780 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
1a790 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
1a7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a7b0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
1a7c0 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
1a7d0 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
1a7e0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
1a7f0 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
1a800 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
1a810 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
1a820 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
1a830 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
1a840 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
1a850 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
1a860 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1a870 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
1a880 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69  ctions transacti
1a890 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
1a8a0 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
1a8b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
1a8c0 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
1a8d0 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
1a8e0 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
1a8f0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
1a900 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
1a910 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
1a920 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
1a930 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
1a940 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
1a950 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
1a960 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
1a970 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
1a980 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
1a990 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
1a9a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1a9b0 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
1a9c0 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
1a9d0 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
1a9e0 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
1a9f0 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
1aa00 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
1aa10 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
1aa20 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
1aa30 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
1aa40 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
1aa50 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1aa60 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
1aa70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
1aa80 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
1aa90 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1aaa0 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
1aab0 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
1aac0 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
1aad0 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
1aae0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1aaf0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
1ab00 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
1ab10 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
1ab20 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
1ab30 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
1ab40 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
1ab50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1ab60 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
1ab70 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
1ab80 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
1ab90 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
1aba0 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
1abb0 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
1abc0 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
1abd0 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
1abe0 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
1abf0 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
1ac00 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
1ac10 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
1ac20 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
1ac30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
1ac40 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
1ac50 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
1ac60 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
1ac70 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
1ac80 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
1ac90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1aca0 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
1acb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1acc0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1acd0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
1ace0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1acf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ad00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ad10 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
1ad20 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
1ad30 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
1ad40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1ad50 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
1ad60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ad70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1ad80 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
1ad90 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
1ada0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
1adb0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1adc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1add0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1ade0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1adf0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ae00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
1ae10 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ae20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1ae30 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1ae40 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
1ae50 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
1ae60 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
1ae70 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
1ae80 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
1ae90 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
1aea0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
1aeb0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
1aec0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
1aed0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
1aee0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
1aef0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
1af00 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
1af10 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
1af20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
1af30 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
1af40 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
1af50 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
1af60 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1af70 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
1af80 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
1af90 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
1afa0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
1afb0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
1afc0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
1afd0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1afe0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
1aff0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
1b000 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
1b010 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
1b020 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
1b030 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
1b040 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
1b050 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
1b060 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
1b070 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1b080 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
1b090 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
1b0a0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1b0b0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1b0c0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1b0d0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
1b0e0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1b0f0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
1b100 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b110 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1b120 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
1b130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1b140 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1b150 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b160 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
1b170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
1b1a0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
1b1b0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
1b1c0 67 65 72 2c 20 69 4e 52 65 63 4f 66 66 73 65 74  ger, iNRecOffset
1b1d0 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
1b1e0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1b1f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4e 52  pPager->jfd, iNR
1b200 65 63 4f 66 66 73 65 74 2c 20 70 50 61 67 65 72  ecOffset, pPager
1b210 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
1b220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b230 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1b240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b250 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1b260 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1b270 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
1b280 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1b290 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1b2a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b2b0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
1b2c0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1b2d0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1b2e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b2f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1b300 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
1b310 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
1b320 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
1b330 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
1b340 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
1b350 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
1b360 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1b370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b380 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b390 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b3a0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f  }..    /* The jo
1b3b0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
1b3c0 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ust successfully
1b3d0 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67   synced. Set Pag
1b3e0 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  er.needSync .   
1b3f0 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20   ** to zero and 
1b400 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
1b410 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1b420 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20  n all pagess..  
1b430 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1b440 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1b450 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b460 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
1b470 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1b480 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
1b490 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1b4a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1b4b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b4c0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
1b4d0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1b4e0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
1b4f0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
1b500 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
1b510 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
1b520 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
1b530 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
1b540 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
1b550 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
1b560 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
1b570 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b580 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
1b590 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
1b5a0 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
1b5b0 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
1b5c0 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
1b5d0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
1b5e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
1b5f0 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
1b600 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
1b610 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
1b620 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
1b630 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
1b640 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
1b650 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b660 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
1b670 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
1b680 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
1b690 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
1b6a0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
1b6b0 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
1b6c0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
1b6d0 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
1b6e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
1b6f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1b700 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1b710 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
1b720 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
1b730 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
1b740 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
1b750 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
1b760 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
1b770 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1b780 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
1b790 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
1b7a0 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
1b7b0 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
1b7c0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
1b7d0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
1b7e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
1b7f0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
1b800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b810 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
1b820 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
1b830 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
1b840 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
1b850 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
1b860 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
1b870 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
1b880 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
1b890 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
1b8a0 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
1b8b0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
1b8c0 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
1b8d0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
1b8e0 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
1b8f0 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
1b900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b910 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
1b920 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
1b930 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
1b940 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
1b950 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
1b960 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1b970 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
1b980 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1b990 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
1b9a0 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
1b9b0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
1b9c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
1b9e0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1b9f0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
1ba00 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
1ba10 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
1ba20 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
1ba30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1ba40 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
1ba50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
1ba60 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
1ba70 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
1ba80 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
1ba90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1baa0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1bab0 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
1bac0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1bad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bae0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1baf0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1bb00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1bb30 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69 73 74   */..  if( pList
1bb40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1bb50 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
1bb60 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
1bb70 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
1bb80 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
1bb90 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
1bba0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
1bbb0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
1bbc0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1bbd0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
1bbe0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
1bbf0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
1bc00 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
1bc10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1bc20 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
1bc30 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
1bc40 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
1bc50 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
1bc60 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
1bc70 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
1bc80 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
1bc90 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
1bca0 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
1bcb0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
1bcc0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
1bcd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1bce0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
1bcf0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
1bd00 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
1bd10 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
1bd20 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
1bd30 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
1bd40 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
1bd50 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
1bd60 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
1bd70 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
1bd80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
1bd90 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
1bda0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
1bdb0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
1bdc0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
1bdd0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
1bde0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
1bdf0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
1be00 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
1be10 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
1be20 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
1be30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1be40 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
1be50 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
1be60 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
1be70 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1be80 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
1be90 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
1bea0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
1beb0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1bec0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
1bed0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1bee0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1bef0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72  _RESERVED );.  r
1bf00 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1bf10 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1bf20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1bf30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
1bf40 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
1bf50 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1bf60 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1bf70 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
1bf80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
1bf90 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
1bfa0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1bfb0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
1bfc0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
1bfd0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
1bfe0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
1bff0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
1c000 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
1c010 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c020 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c030 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c040 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1c050 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
1c060 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
1c070 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
1c080 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
1c090 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
1c0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c0b0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
1c0c0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
1c0d0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
1c0e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
1c0f0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
1c100 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
1c110 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1c120 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
1c130 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
1c140 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
1c150 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1c160 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
1c170 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
1c180 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
1c190 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
1c1a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
1c1b0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
1c1c0 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
1c1d0 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
1c1e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1c1f0 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
1c200 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
1c210 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
1c220 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
1c230 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
1c240 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
1c250 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
1c260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c270 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
1c280 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
1c290 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
1c2a0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
1c2b0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1c2c0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1c2d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c2e0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
1c2f0 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
1c300 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c330 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
1c340 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20  /    ..      /* 
1c350 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
1c360 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
1c370 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
1c380 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
1c390 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
1c3a0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a  _NOMEM, pData);.
1c3b0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
1c3c0 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
1c3d0 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
1c3e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1c3f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
1c400 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1c410 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
1c420 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
1c430 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
1c440 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
1c450 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
1c460 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
1c470 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
1c480 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
1c490 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
1c4a0 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
1c4b0 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
1c4c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c4d0 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
1c4e0 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
1c4f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c500 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c510 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1c520 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1c530 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
1c540 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1c550 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
1c560 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1c570 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c580 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
1c590 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c5a0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
1c5b0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
1c5c0 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
1c5d0 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
1c5e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
1c5f0 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
1c600 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1c610 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1c620 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
1c630 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20 20 20   *)pData);..    
1c640 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c650 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c660 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c690 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c6a0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c6b0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c6c0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c6d0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c6e0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c6f0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c700 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c710 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c720 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c740 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c750 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c760 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c770 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1c780 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1c790 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c7a0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1c7b0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c7c0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1c7d0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1c7e0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1c7f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c810 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1c820 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1c830 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1c840 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1c850 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1c860 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1c870 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1c880 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1c890 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1c8a0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1c8b0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1c8c0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c8d0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1c8e0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1c8f0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1c900 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1c910 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1c920 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1c930 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1c940 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1c950 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c960 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c970 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1c980 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1c990 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1c9a0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1c9b0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1c9c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1c9d0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1c9e0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1c9f0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1ca00 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1ca10 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1ca20 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1ca30 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1ca40 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1ca50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ca60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ca70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1ca80 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1ca90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1caa0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1cab0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1cac0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1cad0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1cae0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1caf0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1cb00 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1cb10 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1cb20 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1cb30 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1cb40 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1cb50 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1cb60 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1cb70 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1cb80 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1cb90 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1cba0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1cbb0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1cbc0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1cbd0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1cbe0 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1cbf0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1cc00 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1cc10 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1cc20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cc30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1cc40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1cc50 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1cc60 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1cc70 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1cc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1cc90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cca0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1ccb0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1ccc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1ccd0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1cce0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1ccf0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1cd00 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1cd10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cd20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cd30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cd40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1cd50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1cd60 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
1cd70 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
1cd80 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
1cd90 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
1cda0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
1cdb0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1cdc0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
1cdd0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
1cde0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
1cdf0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
1ce00 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
1ce10 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
1ce20 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
1ce30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1ce40 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
1ce50 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
1ce60 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
1ce70 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
1ce80 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1ce90 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
1cea0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
1ceb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cec0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1ced0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1cee0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
1cef0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
1cf00 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1cf10 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
1cf20 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
1cf30 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
1cf40 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1cf50 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
1cf60 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
1cf70 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
1cf80 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
1cf90 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
1cfa0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
1cfb0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1cfc0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
1cfd0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
1cfe0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
1cff0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1d000 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d010 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
1d020 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
1d030 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
1d040 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d050 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
1d060 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
1d070 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
1d080 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
1d090 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d0a0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
1d0b0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1d0c0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
1d0d0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d0e0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
1d0f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d100 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
1d110 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1d120 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d130 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
1d140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d150 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1d160 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
1d170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d180 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1d190 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
1d1a0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d1b0 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
1d1c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d1d0 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
1d1e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72   it.  ** is jour
1d1f0 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66  nalling a set of
1d200 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74   two or more dat
1d210 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
1d220 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a   are stored.  **
1d230 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
1d240 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e  k sector. Syncin
1d250 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  g the journal is
1d260 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69   not allowed whi
1d270 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  le.  ** this is 
1d280 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
1d290 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1d2a0 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
1d2b0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74   such a.  ** set
1d2c0 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
1d2d0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
1d2e0 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
1d2f0 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
1d300 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79  tion.  ** is try
1d310 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
1d320 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
1d330 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
1d340 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
1d350 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
1d360 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1d370 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
1d380 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   The pcache laye
1d390 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74  r will.  ** just
1d3a0 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61   have to go ahea
1d3b0 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  d and allocate a
1d3c0 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72   new page buffer
1d3d0 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
1d3e0 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
1d3f0 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
1d400 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20  y, if the pager 
1d410 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
1d420 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
1d430 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  ate, do not.  **
1d440 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
1d450 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
1d460 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  g to disk..  */.
1d470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d480 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
1d490 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d4a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d4b0 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20  NEED_SYNC) ){.  
1d4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4d0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d4e0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d4f0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d500 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d510 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d520 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d530 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d540 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d560 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d570 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d590 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d5a0 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d5b0 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d5c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d5d0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1d5e0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1d5f0 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1d600 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1d610 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1d620 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1d630 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1d640 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1d650 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1d660 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1d670 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1d680 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1d690 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1d6a0 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1d6b0 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1d6c0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1d6d0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1d6e0 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1d6f0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1d700 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1d710 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1d720 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1d730 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1d740 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1d750 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1d760 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1d770 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1d780 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1d790 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1d7a0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1d7b0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1d7c0 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1d7d0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1d7e0 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1d7f0 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1d800 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1d810 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1d820 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1d830 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1d840 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1d850 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1d860 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1d870 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1d880 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1d890 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1d8a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d8b0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1d8c0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1d8d0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1d8e0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1d8f0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1d900 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1d910 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1d920 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1d930 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1d940 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1d950 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1d960 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1d970 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1d980 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1d990 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1d9a0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1d9b0 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1d9c0 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1d9d0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1d9e0 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1d9f0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1da00 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1da10 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1da20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1da30 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1da40 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1da50 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1da60 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1da70 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1da80 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1da90 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1daa0 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1dab0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1dac0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
1dad0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1dae0 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
1daf0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1db00 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1db10 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1db20 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1db30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1db40 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1db50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1db60 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1db70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db80 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1db90 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dba0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1dbb0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1dbc0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1dbd0 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1dbe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dbf0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1dc00 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1dc10 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1dc20 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1dc30 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1dc40 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1dc50 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1dc60 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1dc70 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1dc80 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1dc90 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1dca0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1dcb0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1dcc0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1dcd0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1dce0 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1dcf0 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1dd00 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1dd10 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1dd20 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1dd30 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1dd40 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1dd50 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1dd60 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1dd70 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1dd80 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1dd90 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1dda0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1ddb0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1ddc0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1ddd0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1dde0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1ddf0 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1de00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1de10 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1de20 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1de30 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1de40 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1de50 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1de60 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1de70 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1de80 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1de90 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1dea0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1deb0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1dec0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1ded0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1dee0 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1def0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1df00 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1df10 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1df20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1df30 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1df40 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1df50 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1df60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1df70 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1df80 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1df90 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1dfa0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1dfb0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1dfc0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1dfd0 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1dfe0 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1dff0 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1e000 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1e010 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1e020 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1e030 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1e040 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1e050 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1e060 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1e070 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1e080 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1e090 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1e0a0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1e0b0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1e0c0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1e0d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1e0e0 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1e0f0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1e100 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1e110 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1e120 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1e130 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e140 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1e150 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1e160 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1e170 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1e180 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1e190 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1e1a0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1e1b0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1e1c0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1e1d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1e1e0 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1e1f0 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1e200 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1e210 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1e220 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1e230 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1e240 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1e250 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1e260 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e270 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1e280 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1e290 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1e2a0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1e2b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1e2c0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1e2d0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1e2e0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e2f0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1e300 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e310 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e320 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1e330 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1e340 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1e350 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1e360 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1e370 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e390 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e3a0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e3b0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
1e3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e3d0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e3e0 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e3f0 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
1e400 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e410 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e420 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e430 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e440 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e450 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e460 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e470 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e480 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e490 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e4a0 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e4b0 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e4c0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e4d0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e4e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e4f0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e500 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e510 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e520 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e530 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e540 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e550 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e560 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e570 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e580 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e590 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e5a0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e5b0 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e5c0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e5d0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1e5e0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1e5f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e600 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1e610 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1e620 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1e630 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1e640 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1e650 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1e660 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1e670 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1e680 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1e690 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1e6a0 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1e6b0 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1e6c0 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1e6d0 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1e6e0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1e6f0 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1e700 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1e710 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1e720 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1e730 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1e740 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1e750 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1e760 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1e770 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1e780 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1e790 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1e7a0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1e7b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1e7c0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1e7d0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1e7e0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1e7f0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1e800 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1e810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1e820 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1e830 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1e840 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1e850 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1e860 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1e870 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1e880 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1e890 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1e8a0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1e8b0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1e8c0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1e8d0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1e8e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1e8f0 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1e900 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1e910 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1e920 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1e930 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1e940 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1e950 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1e960 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1e970 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1e980 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1e990 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1e9a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1e9b0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1e9c0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1e9d0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1e9e0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1e9f0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1ea00 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1ea10 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1ea20 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1ea30 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1ea40 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1ea50 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1ea60 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1ea70 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1ea80 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1ea90 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1eaa0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1eab0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1eac0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1ead0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1eae0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1eaf0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1eb00 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1eb10 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1eb20 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1eb30 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1eb40 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1eb50 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1eb60 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1eb70 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1eb80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1eb90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1eba0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ebb0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1ebc0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1ebd0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1ebe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1ebf0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1ec00 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1ec10 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1ec20 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1ec30 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1ec40 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1ec50 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1ec60 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1ec70 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1ec80 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1ec90 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1eca0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1ecb0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1ecc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1ecd0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1ece0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1ecf0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1ed00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1ed10 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1ed20 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1ed30 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1ed40 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1ed50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1ed60 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1ed70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1ed80 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1ed90 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1eda0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1edb0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1edc0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1edd0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1ede0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1edf0 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1ee00 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1ee10 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1ee20 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ee30 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1ee40 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1ee50 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1ee60 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1ee70 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1ee80 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1ee90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eeb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1eec0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1eed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1eee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1eef0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1ef00 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1ef10 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1ef20 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1ef30 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1ef40 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1ef50 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1ef60 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1ef70 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1ef80 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1ef90 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1efa0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1efb0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1efe0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1eff0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1f020 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1f030 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f040 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1f050 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1f060 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1f070 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1f080 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f090 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f0a0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f0b0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1f0c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1f0d0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1f0e0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f0f0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1f100 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1f110 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1f120 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1f130 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1f140 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1f150 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1f160 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1f170 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1f180 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1f190 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1f1a0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1f1b0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1f1c0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1f1d0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1f1e0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1f1f0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1f200 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f210 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1f220 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1f230 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1f240 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1f250 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1f260 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1f270 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1f280 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1f290 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1f2a0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f2b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f2c0 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f2d0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1f2e0 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1f2f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f300 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1f310 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1f320 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1f330 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1f340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f350 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f370 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f380 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f390 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f3a0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f3b0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f3c0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f3d0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f3e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f3f0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f400 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f410 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f420 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f430 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f440 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f450 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f460 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f470 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f480 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f490 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f4a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f4b0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f4c0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f4d0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f4e0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f4f0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f500 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f510 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f520 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f530 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f540 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f550 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f560 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f580 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f590 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f5a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f5b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f5c0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f5d0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1f5e0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1f5f0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1f600 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f610 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1f620 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1f630 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1f640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1f650 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f660 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
1f670 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
1f680 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
1f690 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
1f6a0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
1f6b0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1f6c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1f6d0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
1f6e0 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
1f6f0 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
1f700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f710 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
1f720 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
1f730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f740 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1f750 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f760 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
1f770 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1f780 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
1f790 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1f7a0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
1f7b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1f7c0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
1f7d0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
1f7e0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
1f7f0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
1f800 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
1f810 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
1f820 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
1f830 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1f840 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
1f850 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
1f860 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
1f870 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
1f880 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1f890 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
1f8a0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
1f8b0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1f8c0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
1f8d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f8e0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
1f8f0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
1f900 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
1f910 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1f920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f930 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
1f940 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
1f950 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
1f960 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1f970 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f980 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
1f990 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f9a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
1f9b0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
1f9c0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
1f9d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1f9e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
1f9f0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1fa00 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
1fa10 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1fa20 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
1fa30 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fa40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fa50 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1fa60 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
1fa70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
1fa80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fa90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1faa0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1fab0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
1fac0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
1fad0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1fae0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1faf0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1fb00 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1fb10 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1fb20 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1fb30 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
1fb40 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fb50 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
1fb60 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
1fb70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fb80 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1fb90 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
1fba0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
1fbb0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
1fbc0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
1fbd0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fbe0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
1fbf0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
1fc00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1fc10 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
1fc30 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
1fc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fc50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1fc60 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
1fc70 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
1fc80 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
1fc90 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1fca0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
1fcb0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
1fcc0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
1fcd0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
1fce0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
1fcf0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
1fd00 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
1fd10 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1fd20 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
1fd30 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
1fd40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
1fd50 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
1fd60 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1fd70 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
1fd80 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
1fd90 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
1fda0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
1fdb0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
1fdc0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
1fdd0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
1fde0 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
1fdf0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
1fe00 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
1fe10 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
1fe20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1fe30 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1fe40 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  E;.  }..  /* The
1fe50 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
1fe60 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
1fe70 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
1fe80 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
1fe90 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
1fea0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
1feb0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
1fec0 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
1fed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1fee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ff00 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
1ff10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ff20 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1ff30 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
1ff40 6c 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  lt);.    testcas
1ff50 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1ff60 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
1ff70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
1ff80 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
1ff90 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
1ffa0 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
1ffb0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ffc0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
1ffd0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1ffe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
20000 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
20010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
20020 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
20030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20040 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
20050 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20060 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
20070 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
20080 63 74 2e 20 2a 2f 0a 20 20 6e 45 78 74 72 61 20  ct. */.  nExtra 
20090 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
200a0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
200b0 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
200c0 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
200d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
200e0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
200f0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
20100 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
20110 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
20120 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
20130 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
20140 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
20150 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
20160 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
20170 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
20180 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
20190 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
201a0 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
201b0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
201c0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
201d0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
201e0 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
201f0 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
20200 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20210 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
20220 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
20230 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
20240 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
20250 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20260 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
20270 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
20280 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
20290 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
202a0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
202b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
202c0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
202d0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
202e0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
202f0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
20300 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
20310 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
20320 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
20330 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
20340 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
20350 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
20360 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
20370 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
20380 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
20390 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
203a0 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
203b0 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
203c0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
203d0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
203e0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
203f0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
20400 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
20410 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
20420 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
20430 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
20440 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20450 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
20460 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
20470 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20480 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20490 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
204a0 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
204b0 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
204c0 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
204d0 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
204e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
204f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
20500 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65  nc = (pPager->te
20510 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
20520 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70  urnal) ?1:0;.  p
20530 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
20540 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
20550 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
20560 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
20570 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
20580 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
20590 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
205a0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
205b0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
205c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
205d0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
205e0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
205f0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
20600 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
20610 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20620 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
20630 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
20640 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
20650 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
20660 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
20670 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
20680 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
20690 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
206a0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
206b0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
206c0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
206d0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
206e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
206f0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20700 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
20710 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
20720 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
20730 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
20740 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
20750 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
20760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
20770 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20780 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
20790 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
207a0 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
207b0 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
207c0 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
207d0 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
207e0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
207f0 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20800 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20810 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20820 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20830 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
20840 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
20850 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
20860 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
20870 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
20880 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
20890 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
208a0 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
208b0 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
208c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
208d0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
208e0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
208f0 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
20900 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
20910 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
20920 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20930 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
20940 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
20950 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
20960 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
20970 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
20980 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
20990 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
209a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
209b0 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
209c0 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
209d0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
209e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
209f0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20a00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20a10 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20a20 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20a30 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
20a40 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20a50 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20a60 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
20a70 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
20a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
20a90 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20aa0 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20ab0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20ac0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20ad0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20ae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20af0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
20b00 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
20b10 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20b20 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
20b30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
20b40 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
20b50 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
20b60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
20b70 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
20b80 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
20b90 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20ba0 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20bb0 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20bc0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
20bd0 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
20be0 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
20bf0 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
20c00 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
20c10 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
20c20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20c30 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
20c40 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20c50 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
20c60 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
20c70 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
20c80 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
20c90 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20ca0 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20cb0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20cc0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20cd0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20ce0 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20cf0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20d00 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20d10 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20d20 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20d30 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20d40 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20d50 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20d60 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20d70 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20d80 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20d90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20da0 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20db0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20dc0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20dd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20de0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20df0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20e00 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20e10 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20e20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20e40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20e50 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20e70 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20e80 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20e90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20ea0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20eb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20ec0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20ed0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20ee0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20ef0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20f00 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
20f10 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
20f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
20f30 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
20f40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
20f50 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
20f60 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
20f70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20f80 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
20f90 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20fb0 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
20fc0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
20fd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
20fe0 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
20ff0 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
21000 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
21010 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
21020 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
21030 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
21040 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
21050 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
21060 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
21070 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
21080 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
21090 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
210a0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
210b0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
210c0 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
210d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
210e0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
210f0 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
21100 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
21110 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
21120 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
21130 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
21140 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
21150 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
21160 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
21170 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
21180 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
21190 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
211a0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
211b0 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
211c0 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
211d0 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
211e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
211f0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
21200 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21210 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
21220 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21230 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
21240 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
21250 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
21260 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
21270 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
21280 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
21290 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
212a0 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
212b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
212c0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
212d0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
212e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
212f0 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
21300 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
21310 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
21320 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
21330 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
21340 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
21350 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
21360 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
21370 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
21380 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
21390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
213a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
213b0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
213c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
213d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
213e0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
213f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21400 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
21410 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
21420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21430 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
21440 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
21450 20 20 20 20 7c 7c 20 20 73 71 6c 69 74 65 33 4f      ||  sqlite3O
21460 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
21470 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
21480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21490 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
214a0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
214b0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
214c0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
214d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
214e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
214f0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20  SHARED );.      
21500 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
21510 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
21520 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
21530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21540 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
21550 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
21560 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21580 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
21590 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
215a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
215b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
215c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
215d0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
215e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
215f0 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
21600 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
21610 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
21620 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
21630 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
21640 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
21650 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
21660 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
21670 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
21680 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
21690 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
216a0 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
216b0 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
216c0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
216d0 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
216e0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
216f0 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
21700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21710 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
21720 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
21730 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21740 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
21750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21760 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
21770 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
21780 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
21790 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
217a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
217b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
217c0 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
217d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
217e0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
217f0 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
21800 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
21810 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21820 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
21830 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
21850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21880 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
21890 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
218a0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
218b0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
218c0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
218d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
218e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
218f0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
21900 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
21910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
21920 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
21930 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
21940 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
21950 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
21960 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
21970 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
21980 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
21990 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
219a0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
219b0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
219c0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
219d0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
219e0 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
219f0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
21a00 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
21a10 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
21a20 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
21a30 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
21a40 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
21a50 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
21a60 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
21a70 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
21a80 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
21a90 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
21aa0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
21ab0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
21ac0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
21ad0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
21ae0 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
21af0 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
21b00 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
21b10 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
21b20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21b30 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
21b40 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
21b50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21b60 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
21b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
21b90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21ba0 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
21bb0 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
21bc0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
21bd0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
21be0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
21bf0 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
21c00 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
21c10 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
21c20 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
21c30 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
21c40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
21c50 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
21c60 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
21c70 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
21c80 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
21c90 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
21ca0 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
21cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
21cd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
21ce0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
21cf0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
21d00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
21d10 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
21d20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
21d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
21d40 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
21d50 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
21d60 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
21d70 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
21d80 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
21d90 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
21da0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
21db0 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
21dc0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
21dd0 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
21de0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
21df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21e00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36  urn code */.  i6
21e10 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20  4 iOffset;      
21e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
21e30 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69 6c  te offset of fil
21e40 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
21e50 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21e60 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21e70 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
21e80 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69 73  DB );..  if( !is
21e90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
21ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21eb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21ec0 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
21ed0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
21ee0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
21ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21f00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66  TE_OK;.  }.  iOf
21f10 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
21f20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
21f30 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
21f40 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
21f50 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
21f60 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
21f70 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Size, iOffset);.
21f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21f90 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21fa0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  D ){.    rc = SQ
21fb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21fc0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
21fd0 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
21fe0 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
21ff0 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d  Data)[24];.    m
22000 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
22010 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
22020 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
22030 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22040 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
22050 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
22060 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
22070 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
22080 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
22090 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
220a0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
220b0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
220c0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
220d0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
220e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
220f0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
22100 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
22110 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
22120 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22130 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
22140 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
22150 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
22160 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22180 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22190 77 68 65 6e 65 76 65 72 20 74 68 65 20 75 70 70  whenever the upp
221a0 65 72 20 6c 61 79 65 72 20 72 65 71 75 65 73 74  er layer request
221b0 73 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  s a database.** 
221c0 70 61 67 65 20 69 73 20 72 65 71 75 65 73 74 65  page is requeste
221d0 64 2c 20 62 65 66 6f 72 65 20 74 68 65 20 63 61  d, before the ca
221e0 63 68 65 20 69 73 20 63 68 65 63 6b 65 64 20 66  che is checked f
221f0 6f 72 20 61 20 73 75 69 74 61 62 6c 65 20 70 61  or a suitable pa
22200 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74  ge.** or any dat
22210 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  a is read from t
22220 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 74 20  he database. It 
22230 70 65 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c  performs the fol
22240 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75  lowing.** two fu
22250 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
22260 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
22270 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
22280 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
22290 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
222a0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
222b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
222c0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
222d0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
222e0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
222f0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
22300 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
22310 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
22320 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
22330 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
22340 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
22350 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
22360 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
22370 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
22380 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
22390 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
223a0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
223b0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
223c0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
223d0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
223e0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
223f0 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
22400 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
22410 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
22420 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22430 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
22440 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
22450 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
22460 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
22470 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
22480 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
22490 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
224a0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
224b0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
224c0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
224d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
224e0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
224f0 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
22500 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
22510 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
22520 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
22530 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
22540 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
22550 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
22560 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22570 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
22580 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
22590 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
225a0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
225b0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
225c0 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29  described by (2)
225d0 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74   above is not at
225e0 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20  tempted, and if 
225f0 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  the.** pager is 
22600 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
22610 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
22620 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68  ITE_FULL when th
22630 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  is is called,.**
22640 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
22650 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
22660 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70  eturned. It is p
22670 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64  ermitted to read
22680 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
22690 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f   when in SQLITE_
226a0 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65  FULL error state
226b0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
226c0 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
226d0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
226e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
226f0 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
22700 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
22710 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
22720 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
22730 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
22740 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f  ournal.** file o
22750 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
22760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
22770 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
22780 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
22790 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
227a0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
227b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
227c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
227d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
227e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
227f0 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  */.  int isError
22800 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  Reset = 0;      
22810 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22820 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72  if recovering fr
22830 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  om error state *
22840 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
22850 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
22860 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
22870 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
22880 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
22890 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
228a0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
228b0 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73  rror-state, this
228c0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
228d0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
228e0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
228f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22900 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
22910 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
22920 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
22930 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
22940 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
22950 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
22960 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
22970 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
22980 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
22990 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
229a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
229b0 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  ode .  ){.    if
229c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
229d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
229e0 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b  sErrorReset = 1;
229f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
22a00 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
22a10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65  ITE_OK;.    page
22a20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
22a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
22a40 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c  e pager is still
22a50 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
22a60 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65  te, do not proce
22a70 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20  ed. The error . 
22a80 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62   ** state will b
22a90 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d  e cleared at som
22aa0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
22ab0 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70  uture when all p
22ac0 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  age .  ** refere
22ad0 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64  nces are dropped
22ae0 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63   and the cache c
22af0 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  an be discarded.
22b00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
22b10 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
22b20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
22b30 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
22b40 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
22b50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
22b60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22b70 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
22b80 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65  K || isErrorRese
22b90 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22ba0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
22bb0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
22bc0 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a  ;.    int isHotJ
22bd0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
22be0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
22bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
22c00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
22c10 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22c20 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  che)==0 );.    i
22c30 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65  f( !pPager->noRe
22c40 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
22c50 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
22c60 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
22c70 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
22c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22ca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22cb0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
22cc0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
22cd0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
22ce0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
22cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22d00 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
22d10 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
22d20 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
22d30 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
22d40 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
22d50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22d60 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
22d70 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
22d80 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
22d90 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
22da0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
22db0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
22dc0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22dd0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
22de0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
22df0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
22e00 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
22e10 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
22e20 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72  Reset ){.      r
22e30 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
22e40 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
22e50 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
22e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22e70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22e80 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22e90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
22ea0 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
22eb0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
22ec0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
22ed0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22ee0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22ef0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
22f00 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
22f10 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
22f20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22f30 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
22f40 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
22f50 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
22f60 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
22f70 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
22f80 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
22f90 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
22fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
22fb0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
22fc0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
22fd0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
22fe0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
22ff0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
23000 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
23010 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
23020 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
23030 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
23040 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
23050 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
23060 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
23070 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
23080 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
23090 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
230a0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
230b0 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
230c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
230d0 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
230e0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
230f0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
23100 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
23110 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
23120 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
23130 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
23140 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
23150 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
23160 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
23170 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
23180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23190 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
231a0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
231b0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
231c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
231d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
231e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
231f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
23200 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23220 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
23230 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
23240 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  VE;.      }. .  
23250 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
23260 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
23270 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
23280 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
23290 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n .      ** excl
232a0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
232b0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
232c0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
232d0 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
232e0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
232f0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
23300 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
23310 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
23320 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54  the.      ** OsT
23330 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
23340 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
23350 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
23360 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
23370 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
23380 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
23390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
233a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
233b0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
233c0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
233d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
233e0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
233f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
23400 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
23410 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
23420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23440 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
23450 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
23460 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23470 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
23480 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
23490 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
234a0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
234b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
234c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
234d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
234e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
234f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
23500 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
23510 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
23520 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23530 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23540 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
23550 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
23560 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23570 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
23580 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
23590 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
235a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
235b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
235d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
235e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
235f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23610 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
23620 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
23630 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e  exist, that mean
23640 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
23650 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20  cess.           
23660 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
23670 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a  rolled it back *
23680 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
23690 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
236a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
236b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
236c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
236d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
236e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
236f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
23700 54 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68  TODO: Why are th
23710 65 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65  ese cleared here
23720 3f 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72  ? Is it necessar
23730 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  y? */.      pPag
23740 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
23750 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
23760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23770 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23780 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
23790 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
237a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
237b0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
237c0 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
237d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
237e0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
237f0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
23800 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
23810 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
23820 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
23830 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
23840 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
23850 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
23860 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
23870 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
23880 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
23890 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20  ent cache..     
238a0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
238b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
238c0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
238d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
238e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
238f0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
23900 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
23910 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23930 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
23940 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
23950 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ED).           |
23960 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
23970 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
23980 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
23990 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
239a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
239b0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
239c0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
239d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
239e0 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a  ->pPCache)>0 ){.
239f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
23a00 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
23a10 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
23a20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23a30 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
23a40 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
23a50 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
23a60 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
23a70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
23a80 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
23a90 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
23aa0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
23ab0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
23ac0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
23ad0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
23ae0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
23af0 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
23b00 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
23b10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23b20 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
23b30 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
23b40 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
23b50 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
23b60 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
23b70 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
23b80 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
23b90 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
23ba0 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
23bb0 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
23bc0 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
23bd0 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
23be0 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
23bf0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
23c00 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
23c10 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
23c20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
23c30 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
23c40 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
23c50 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
23c60 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
23c70 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
23c80 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
23c90 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
23ca0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
23cb0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
23cc0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
23cd0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
23ce0 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
23cf0 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
23d00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
23d10 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
23d20 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
23d30 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20  FileVers)];.    
23d40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
23d50 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
23d60 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  0);..      if( p
23d70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
23d80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
23d90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
23da0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23db0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
23dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23dd0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
23de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
23df0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
23e00 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
23e10 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
23e20 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
23e30 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
23e40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
23e50 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
23e60 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
23e70 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
23e80 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
23e90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
23ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23eb0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23ec0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
23ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23ee0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
23ef0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
23f00 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
23f10 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
23f20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
23f30 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
23f40 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
23f50 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
23f60 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
23f70 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23f90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23fa0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
23fb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
23fc0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
23fd0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
23fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23ff0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  K ){.    /* page
24000 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20  r_unlock() is a 
24010 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73  no-op for exclus
24020 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d  ive mode and in-
24030 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
24040 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75  . */.    pager_u
24050 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
24060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24070 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
24080 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
24090 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
240a0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
240b0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
240c0 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
240d0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
240e0 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
240f0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
24100 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
24110 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
24120 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
24130 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
24140 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
24150 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
24160 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
24170 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
24180 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
24190 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
241a0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
241b0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
241c0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
241d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
241e0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
241f0 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26  Cache)==0).   &&
24200 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
24210 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
24220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
24230 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
24240 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
24250 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
24260 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20  }../*.** Drop a 
24270 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61  page from the ca
24280 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  che using sqlite
24290 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a  3PcacheDrop()..*
242a0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61  *.** If this mea
242b0 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77  ns there are now
242c0 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72   no pages with r
242d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
242e0 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  m, a rollback.**
242f0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
24300 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
24310 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e  base is removed.
24320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24330 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62  pagerDropPage(Db
24340 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
24350 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
24360 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c  g->pPager;.  sql
24370 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
24380 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  Pg);.  pagerUnlo
24390 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
243a0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  r);.}../*.** Acq
243b0 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
243c0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
243d0 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
243e0 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
243f0 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
24400 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
24410 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
24420 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
24430 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
24440 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
24450 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
24460 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
24470 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
24480 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
24490 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
244a0 29 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  ) to obtain a SH
244b0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20  ARED lock on.** 
244c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
244d0 65 20 69 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  e if such a lock
244e0 20 6f 72 20 67 72 65 61 74 65 72 20 69 73 20 6e   or greater is n
244f0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  ot already held.
24500 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 63 61 75  .** This may cau
24510 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  se hot-journal r
24520 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63 61 63  ollback or a cac
24530 68 65 20 70 75 72 67 65 2e 20 53 65 65 20 63 6f  he purge. See co
24540 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76 65 20  mments.** above 
24550 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72 53 68  function pagerSh
24560 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72 20 64  aredLock() for d
24570 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  etails..**.** If
24580 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
24590 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
245a0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
245b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
245c0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
245d0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
245e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
245f0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
24600 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
24610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24620 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
24630 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
24640 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
24650 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
24660 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
24670 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
24680 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
24690 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
246a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
246b0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
246c0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
246d0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
246e0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
246f0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
24700 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
24710 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
24720 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
24730 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
24740 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
24750 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
24760 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
24770 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
24780 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
24790 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
247a0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
247b0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
247c0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
247d0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
247e0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
247f0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
24800 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
24810 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
24820 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
24830 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
24840 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
24850 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
24860 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
24870 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
24880 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
24890 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
248a0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
248b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
248c0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
248d0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
248e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
248f0 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
24900 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
24910 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
24920 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
24930 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
24940 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
24950 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
24960 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
24970 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
24980 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
24990 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
249a0 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
249b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
249c0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
249d0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
249e0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
249f0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
24a00 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
24a10 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
24a20 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 70 6f   the cache to po
24a30 70 75 6c 61 74 65 20 77 69 74 68 20 74 68 65 20  pulate with the 
24a40 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
24a50 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
24a60 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
24a70 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
24a80 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
24a90 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
24aa0 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
24ab0 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
24ac0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
24ad0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
24ae0 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
24af0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
24b00 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
24b10 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
24b20 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
24b30 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
24b40 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
24b50 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
24b60 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
24b70 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
24b80 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
24b90 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
24ba0 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
24bb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
24bc0 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
24bd0 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
24be0 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
24bf0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
24c00 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
24c10 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
24c20 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
24c30 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
24c40 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
24c50 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
24c60 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
24c70 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
24c80 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
24c90 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
24ca0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24cb0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
24cc0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
24cd0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
24ce0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
24cf0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
24d00 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
24d10 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
24d20 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
24d30 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
24d40 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
24d50 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
24d60 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
24d70 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
24d80 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
24d90 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
24da0 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
24db0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
24dc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
24dd0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
24de0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
24df0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
24e00 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
24e10 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
24e20 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
24e30 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
24e40 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
24e50 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
24e60 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
24e70 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
24e80 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
24e90 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
24ea0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24eb0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
24ec0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
24ed0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
24ee0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24ef0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
24f00 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
24f10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
24f20 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
24f30 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
24f40 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
24f50 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
24f60 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
24f70 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
24f80 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
24f90 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
24fa0 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
24fb0 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
24fc0 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  Pg = 0;.  int rc
24fd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
24fe0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24ff0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
25000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25010 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
25020 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69   .       || sqli
25030 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
25040 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
25050 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e)>0 .       || 
25060 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20  pgno==1.  );..  
25070 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
25080 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
25090 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
250a0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
250b0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
250c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
250d0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
250e0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
250f0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
25100 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
25110 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
25120 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
25130 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
25140 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25150 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
25160 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
25170 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
25180 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
25190 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
251a0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
251b0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pPage = 0;..  /*
251c0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
251d0 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
251e0 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
251f0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
25200 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25210 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
25220 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
25230 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
25240 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
25250 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
25260 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
25270 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
25280 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
252a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
252b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
252c0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
252d0 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  CK );..  rc = sq
252e0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
252f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
25300 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29  , pgno, 1, &pPg)
25310 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
25320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
25330 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
25340 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
25350 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
25360 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
25370 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70  pPager || pPg->p
25380 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Pager==0 );.  if
25390 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  ( pPg->pPager==0
253a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
253b0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
253c0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
253d0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
253e0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
253f0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
25400 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
25410 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  Max;.    PAGER_I
25420 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
25430 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  s);.    pPg->pPa
25440 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
25450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25460 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
25470 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
25480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
254a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
254b0 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
254c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
254d0 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
254e0 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
254f0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
25500 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
25510 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
25520 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25530 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
25540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25550 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
25560 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
25570 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
25580 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
25590 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
255a0 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
255b0 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
255c0 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
255d0 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
255e0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
255f0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
25600 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
25610 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
25620 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
25630 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
25640 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
25650 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
25660 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
25670 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
25680 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
25690 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
256a0 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
256b0 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
256c0 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
256d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
256e0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
256f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
25700 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
25710 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
25720 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
25730 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
25740 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
25750 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
25760 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
25770 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
25780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
25790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
257a0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
257b0 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
257c0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
257d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
257e0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
257f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
25800 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
25810 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
25820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25830 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
25840 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
25850 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
25860 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
25870 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
25880 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
25890 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
258a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
258b0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
258c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
258d0 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
258e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
258f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25900 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65     pagerDropPage
25910 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
25920 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25930 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
25940 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
25950 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
25960 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
25970 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
25980 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
25990 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
259a0 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
259b0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
259c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
259d0 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 7d 0a  ger->nHit);.  }.
259e0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
259f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25a00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
25a10 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
25a20 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
25a30 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25a40 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
25a50 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
25a60 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
25a70 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25a80 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
25a90 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
25aa0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
25ab0 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
25ac0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
25ad0 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
25ae0 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
25af0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25b00 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
25b10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
25b20 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
25b30 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
25b40 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
25b50 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
25b60 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
25b70 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
25b80 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25b90 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
25ba0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
25bb0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
25bc0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
25bd0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
25be0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25bf0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
25c00 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
25c10 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
25c20 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
25c30 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
25c40 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
25c50 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
25c60 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
25c70 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
25c80 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
25c90 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25ca0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
25cb0 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
25cc0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
25cd0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
25ce0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50 61  0 );..  if( (pPa
25cf0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
25d00 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20  R_UNLOCK).   && 
25d10 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
25d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
25d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
25d40 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29  SQLITE_FULL).  )
25d50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
25d60 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
25d70 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
25d80 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  0, &pPg);.  }.. 
25d90 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
25da0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
25db0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
25dc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
25dd0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
25de0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
25df0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
25e00 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
25e10 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
25e20 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
25e30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
25e40 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
25e50 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
25e60 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
25e70 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
25e80 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
25e90 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
25ea0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25eb0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
25ec0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
25ed0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
25ee0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
25ef0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
25f00 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
25f10 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
25f20 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
25f30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
25f40 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
25f50 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
25f60 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
25f70 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
25f80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
25f90 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
25fa0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
25fb0 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
25fc0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
25fd0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
25fe0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25ff0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
26000 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
26010 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
26020 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
26030 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
26040 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
26050 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
26060 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
26070 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
26080 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
26090 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
260a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
260b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73  ITE_OK;.  if( is
260c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
260d0 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
260e0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
260f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
26100 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
26110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
26120 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
26130 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
26140 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
26150 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
26160 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
26170 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26180 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
26190 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
261a0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
261b0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
261c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
261d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
261e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
261f0 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
26200 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
26210 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26220 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
26230 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
26240 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
26250 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26260 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
26270 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
26280 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
26290 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
262a0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
262b0 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
262c0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
262d0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
262e0 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
262f0 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
26300 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
26310 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
26320 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
26330 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26340 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
26350 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
26360 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
26370 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
26380 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
26390 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
263a0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
263b0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
263c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
263d0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
263e0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
263f0 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
26400 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
26410 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
26420 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
26430 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26440 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
26450 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
26460 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
26470 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
26480 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
26490 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
264a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
264b0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
264c0 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
264d0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
264e0 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
264f0 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
26500 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26510 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
26520 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
26530 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
26540 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
26550 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
26560 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
26570 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
26580 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
26590 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
265a0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
265b0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
265c0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
265d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
265e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
265f0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
26600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26610 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26630 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26640 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26650 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
26660 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
26670 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
26680 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
26690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
266a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
266b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
266c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
266d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
266e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
266f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
26700 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
26710 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
26720 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
26730 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  on is a no-op. *
26740 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
26750 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
26760 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
26770 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
26780 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61   TODO: Is it rea
26790 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
267a0 67 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62  get here with db
267b0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66  SizeValid==0? If
267c0 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63   not,.  ** the c
267d0 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65  all to PagerPage
267e0 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72  count() can be r
267f0 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74  emoved..  */.  t
26800 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
26810 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
26820 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
26830 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
26840 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72  r, 0);..  pPager
26850 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
26860 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
26870 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
26880 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
26890 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
268a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
268b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
268c0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
268d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
268e0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
268f0 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
26900 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26910 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
26920 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26930 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
26940 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
26950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26960 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26970 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
26980 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
26990 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
269c0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
269d0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
269e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
269f0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
26a00 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28  REATE|.        (
26a10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
26a20 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53   ? .          (S
26a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
26a40 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
26a50 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
26a60 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53  L):.          (S
26a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26a80 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
26a90 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
26aa0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
26ab0 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
26ac0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
26ad0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
26ae0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26af0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
26b00 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
26b10 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
26b20 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
26b30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26b40 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
26b50 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26b60 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26b70 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
26b80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26b90 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
26ba0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
26bb0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a  r->jfd) );.  }..
26bc0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
26bd0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
26be0 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
26bf0 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
26c00 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  n .  ** the sub-
26c10 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
26c20 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
26c30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26c40 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43  {.    /* TODO: C
26c50 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
26c60 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
26c70 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
26c80 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
26c90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
26ca0 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
26cb0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
26cc0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26cd0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
26ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
26cf0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26d00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
26d10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
26d20 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
26d30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26d40 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Hdr = 0;.    rc 
26d50 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
26d60 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
26d70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26d80 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  OK && pPager->nS
26d90 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
26da0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
26db0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
26dc0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
26dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
26de0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
26df0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
26e00 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
26e10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
26e20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26e30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
26e40 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
26e50 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
26e60 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
26e70 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
26e80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
26e90 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26ea0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
26eb0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26ec0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
26ed0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
26ee0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
26ef0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
26f00 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
26f10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26f20 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
26f30 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
26f40 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
26f50 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
26f60 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
26f70 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
26f80 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
26f90 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
26fa0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
26fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
26fc0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
26fd0 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
26fe0 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f  file and, the jo
26ff0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a  urnal file is .*
27000 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68  * opened if it h
27010 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65  as not been alre
27020 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f  ady. For a tempo
27030 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f  rary file, the o
27040 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68  pening .** of th
27050 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27060 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
27070 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
27080 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20  ual need to .** 
27090 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
270a0 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20  rnal. TODO: Why 
270b0 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79  handle temporary
270c0 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74   files different
270d0 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ly?.**.** If the
270e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
270f0 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69   opened (or if i
27100 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
27110 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f  n), then a.** jo
27120 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
27130 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
27140 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a  tart of it..**.*
27150 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
27160 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
27170 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
27180 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
27190 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
271a0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
271b0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
271c0 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
271d0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
271e0 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
271f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27200 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27210 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
27220 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
27230 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
27240 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
27250 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
27260 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
27270 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
27280 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
27290 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
272a0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
272b0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
272c0 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
272d0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
272e0 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
272f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
27300 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
27310 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
27320 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
27330 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
27340 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
27350 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
27360 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
27370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27380 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
27390 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
273a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
273b0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
273c0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
273d0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28  jInMemory;.  if(
273e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
273f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
27400 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27410 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
27420 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27430 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
27440 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27450 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  .    /* Obtain a
27460 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
27470 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27480 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
27490 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
274a0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
274b0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
274c0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
274d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
274e0 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79   The.    ** busy
274f0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
27500 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
27510 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
27520 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
27530 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
27540 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
27550 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
27560 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
27570 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
27580 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
27590 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
275a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
275b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
275c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
275d0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
275e0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
275f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
27600 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
27610 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
27620 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
27630 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27640 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64   If the required
27650 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63   locks were succ
27660 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
27670 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  d, open the jour
27680 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
27690 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69  and write the fi
276a0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
276b0 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  er to it..    */
276c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
276d0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
276e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
276f0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
27700 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
27710 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
27720 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
27730 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
27740 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27750 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
27760 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27770 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
27780 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
27790 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
277a0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
277b0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
277c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
277d0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
277e0 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
277f0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
27800 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
27810 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
27820 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
27830 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
27840 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
27850 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27860 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
27870 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
27880 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
27890 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
278a0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
278b0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
278c0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
278d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
278e0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
278f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27900 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
27910 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
27920 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
27930 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
27940 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
27950 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
27960 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
27970 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
27980 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
27990 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
279a0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
279b0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
279c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
279d0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
279e0 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
279f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
27a00 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
27a10 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
27a20 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
27a30 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
27a40 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
27a50 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
27a60 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
27a70 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
27a80 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
27a90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
27aa0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
27ab0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
27ac0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
27ad0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
27ae0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
27af0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
27b00 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
27b10 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
27b20 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
27b30 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
27b40 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
27b50 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27b60 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
27b70 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
27b80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
27b90 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
27ba0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27bb0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
27bc0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
27bd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27be0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
27bf0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
27c00 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
27c10 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
27c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27c30 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
27c40 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
27c50 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
27c60 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
27c70 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
27c80 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
27c90 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
27ca0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
27cb0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
27cc0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
27cd0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
27ce0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
27cf0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
27d00 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
27d10 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
27d20 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
27d30 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
27d40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
27d50 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
27d60 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
27d70 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
27d80 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
27d90 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
27da0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
27db0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
27dc0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
27dd0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
27de0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
27df0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
27e00 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
27e10 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
27e20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
27e30 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
27e40 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
27e50 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
27e60 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
27e70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
27e80 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
27e90 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
27ea0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
27eb0 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
27ec0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
27ed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27f00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
27f10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
27f20 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
27f30 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
27f40 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
27f50 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
27f60 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  l.          && p
27f70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27f80 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
27f90 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
27fa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
27fb0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
27fc0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
27fd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27fe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27ff0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
28000 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
28010 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
28020 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
28030 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
28040 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
28050 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
28060 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
28070 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
28080 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
28090 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
280a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
280b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
280c0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
280d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
280e0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
280f0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
28100 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
28110 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
28120 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
28130 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
28140 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
28150 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
28160 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
28170 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
28180 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
28190 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
281a0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
281b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
281c0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
281d0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
281e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
281f0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
28200 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
28210 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
28220 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
28230 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
28240 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
28250 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28260 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28270 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
28280 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
28290 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
282a0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
282b0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
282c0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
282d0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
282e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
282f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28300 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28310 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28340 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28350 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
28360 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
283a0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
283b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
283c0 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
283d0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
283e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
283f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28400 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
28410 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
28420 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28430 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
28440 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
28450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28460 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
28470 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28480 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
28490 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
284a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
284c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
284d0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
284e0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
284f0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
28500 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
28510 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
28520 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
28530 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
28540 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
28550 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28560 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28570 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28580 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
28590 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
285a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
285b0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
285c0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
285d0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
285e0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
285f0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
28600 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
28610 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
28620 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
28630 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
28640 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
28650 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
28660 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
28670 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
28680 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
28690 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
286a0 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
286b0 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
286c0 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
286d0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
286e0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
286f0 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
28700 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28710 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
28720 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28730 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
28740 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
28750 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
28760 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
28770 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
28780 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28790 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
287a0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
287b0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
287c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
287d0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
287e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
287f0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
28800 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
28810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28820 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
28830 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
28840 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
28850 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
28860 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
28870 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
28880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28890 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
288a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
288b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
288c0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
288d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
288e0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
288f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28900 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
28910 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
28920 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
28930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28940 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28950 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28960 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28970 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
28980 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
28990 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
289a0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
289b0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
289c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
289d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
289e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
289f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28a00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
28a10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28a20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28a30 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
28a40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
28a50 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
28a60 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28a70 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28a80 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28a90 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28aa0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28ab0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
28ac0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28ad0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
28ae0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
28af0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28b00 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
28b10 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28b30 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
28b40 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
28b50 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
28b60 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
28b70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28b80 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
28b90 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
28ba0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
28bb0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
28bc0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
28bd0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
28be0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
28bf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
28c00 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
28c10 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
28c20 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
28c30 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
28c40 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
28c50 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
28c60 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
28c70 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
28c80 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
28c90 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
28ca0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
28cb0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
28cc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
28cd0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
28ce0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
28cf0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28d00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28d10 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
28d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
28d30 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
28d40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
28d50 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
28d60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
28d80 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
28d90 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
28da0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
28db0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
28dc0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
28dd0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
28de0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
28df0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28e00 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
28e10 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
28e20 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
28e30 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
28e40 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
28e50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
28e60 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
28e70 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
28e80 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
28e90 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
28ea0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
28eb0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
28ec0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
28ed0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
28ee0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
28ef0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
28f00 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
28f10 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
28f20 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
28f30 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
28f40 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
28f50 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28f60 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
28f70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
28f80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
28f90 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
28fa0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
28fb0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
28fc0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
28fd0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
28fe0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
28ff0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29000 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
29010 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
29020 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29030 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
29040 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
29050 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29060 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
29070 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
29080 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
29090 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
290a0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
290b0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
290c0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
290d0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
290e0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
290f0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
29100 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
29110 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
29120 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29130 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29140 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29150 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
29160 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
29170 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29180 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
29190 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
291a0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
291b0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
291c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
291d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
291e0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
291f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29200 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
29210 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29220 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
29230 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
29240 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
29250 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
29260 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
29270 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
29280 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
29290 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
292a0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
292b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
292c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
292d0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
292e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
292f0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
29300 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
29310 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
29320 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
29330 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
29340 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
29350 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
29360 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
29370 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
29380 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
29390 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
293a0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
293b0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
293c0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
293d0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
293e0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
293f0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
29400 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
29410 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
29420 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29430 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
29440 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
29450 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
29460 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
29470 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
29480 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
29490 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
294a0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
294b0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
294c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
294d0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
294e0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
294f0 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
29500 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
29510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29520 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
29530 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
29540 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
29550 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
29560 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
29570 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29580 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
29590 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
295a0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
295b0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
295c0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
295d0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
295e0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
295f0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
29600 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
29610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
29620 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
29630 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29650 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
29660 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
29670 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
296a0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
296b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
296c0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
296d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
296e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
296f0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
29710 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
29720 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
29730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29740 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29750 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29770 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29780 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
29790 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
297a0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
297b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
297c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
297d0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
297e0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
297f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29800 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29810 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29820 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
29830 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
29840 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
29850 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
29860 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
29870 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
29880 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
29890 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
298a0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
298b0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
298c0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
298d0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
298e0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
298f0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
29900 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
29910 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
29920 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
29930 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
29940 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
29950 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
29960 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
29970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29990 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
299a0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
299b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
299c0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
299d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
299e0 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
299f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
29a00 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
29a10 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
29a20 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
29a30 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
29a40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
29a50 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
29a60 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
29a70 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
29a80 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
29a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
29ab0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
29ac0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
29ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
29ae0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
29af0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
29b00 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
29b10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
29b20 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
29b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29b50 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
29b60 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
29b70 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
29b80 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
29b90 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
29ba0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
29bb0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
29bc0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
29bd0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
29be0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
29bf0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
29c00 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
29c10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29c20 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
29c30 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
29c40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
29c50 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
29c60 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
29c70 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
29c80 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
29c90 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
29ca0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
29cb0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
29cc0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
29cd0 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
29ce0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
29cf0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
29d00 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
29d10 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
29d20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
29d30 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
29d40 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
29d50 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
29d60 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
29d70 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
29d80 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
29d90 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
29da0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
29db0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
29dc0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
29dd0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
29de0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
29df0 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
29e00 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
29e10 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
29e20 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
29e30 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
29e40 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
29e50 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
29e60 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
29e70 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
29e80 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
29e90 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
29ea0 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
29eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
29ec0 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
29ed0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
29ee0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
29ef0 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
29f00 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
29f10 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
29f20 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
29f30 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
29f40 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
29f50 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
29f60 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
29f70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
29f80 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
29f90 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29fa0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
29fb0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
29fc0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
29fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
29fe0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
29ff0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2a000 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2a010 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2a020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a030 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2a040 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2a050 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2a060 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2a070 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2a080 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2a090 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2a0a0 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2a0b0 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2a0c0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2a0d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2a0e0 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67  he isDirect flag
2a0f0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
2a100 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
2a110 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2a120 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2a130 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
2a140 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
2a150 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2a160 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
2a170 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
2a180 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
2a190 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
2a1a0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2a1b0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
2a1c0 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
2a1d0 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  t flag may only 
2a1e0 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
2a1f0 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
2a200 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
2a210 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2a220 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
2a230 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
2a240 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
2a250 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
2a260 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2a270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a280 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
2a290 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
2a2a0 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
2a2b0 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
2a2c0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
2a2d0 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
2a2e0 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
2a2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2a300 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2a310 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
2a320 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
2a330 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
2a340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a350 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
2a360 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
2a370 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
2a380 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
2a390 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
2a3a0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2a3b0 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
2a3c0 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
2a3d0 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
2a3e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
2a3f0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2a400 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
2a410 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
2a420 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
2a430 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2a440 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
2a450 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
2a460 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
2a470 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
2a480 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2a490 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
2a4a0 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
2a4b0 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
2a4c0 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
2a4d0 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
2a4e0 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
2a4f0 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
2a500 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
2a510 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
2a520 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
2a530 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
2a540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
2a550 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2a560 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  TE.  const int i
2a570 73 44 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 61  sDirect = 0;.  a
2a580 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
2a590 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
2a5a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2a5b0 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
2a5c0 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
2a5d0 44 69 72 65 63 74 20 3d 20 69 73 44 69 72 65 63  Direct = isDirec
2a5e0 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a 20  tMode;.#endif.. 
2a5f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a600 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2a610 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
2a620 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
2a630 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
2a640 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
2a650 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2a660 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2a670 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
2a680 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20  o page 1 */.    
2a690 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
2a6a0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
2a6b0 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
2a6c0 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  f change-counter
2a6d0 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61   field */..    a
2a6e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2a6f0 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
2a700 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2a710 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
2a720 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
2a730 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
2a740 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2a750 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2a760 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
2a770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
2a780 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
2a790 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
2a7a0 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
2a7b0 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
2a7c0 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
2a7d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
2a7e0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
2a7f0 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
2a800 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
2a810 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  itable..    */. 
2a820 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a830 45 5f 4f 4b 20 26 26 20 21 69 73 44 69 72 65 63  E_OK && !isDirec
2a840 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
2a850 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a860 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2a870 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2a880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a890 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2a8a0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2a8b0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2a8c0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2a8d0 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2a8e0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2a8f0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2a900 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2a910 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2a920 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2a930 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2a940 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2a950 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2a960 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2a970 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2a980 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2a990 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2a9a0 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2a9b0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2a9c0 69 66 28 20 69 73 44 69 72 65 63 74 20 29 7b 0a  if( isDirect ){.
2a9d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
2a9e0 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64  id *zBuf = pPgHd
2a9f0 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
2aa00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2aa10 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29  ->dbFileSize>0 )
2aa20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2aa30 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2aa40 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
2aa50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2aa60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
2aa70 20 20 20 20 20 2f 2a 20 49 66 20 65 76 65 72 79       /* If every
2aa80 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73 65  thing worked, se
2aa90 74 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  t the changeCoun
2aaa0 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a 20  tDone flag. */. 
2aab0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2aac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2aad0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2aae0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2aaf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2ab00 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2ab10 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2ab20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
2ab30 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
2ab40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ab50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
2ab60 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
2ab70 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
2ab80 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
2ab90 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a  -memory files.**
2aba0 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
2abb0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
2abc0 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
2abd0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
2abe0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  r called on a pa
2abf0 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74  ger for which it
2ac00 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69   is a no-op, thi
2ac10 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
2ac20 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2ac30 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49   Otherwise, an I
2ac40 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2ac50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2ac60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
2ac70 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2ac80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2acb0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
2acc0 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
2acd0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2ace0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2acf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2ad00 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2ad10 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2ad20 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2ad30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ad40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2ad50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ad60 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2ad70 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2ad80 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2ad90 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2ada0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2adb0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2adc0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2add0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2ade0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2adf0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2ae00 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2ae10 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
2ae20 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
2ae30 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2ae40 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
2ae50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ae60 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
2ae70 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
2ae80 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2ae90 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
2aea0 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
2aeb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2aec0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
2aed0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2aee0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
2aef0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
2af00 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
2af10 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2af20 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
2af30 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2af40 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
2af50 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
2af60 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
2af70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
2af80 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
2af90 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
2afa0 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
2afb0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
2afc0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
2afd0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
2afe0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
2aff0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
2b000 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
2b010 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
2b020 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
2b030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
2b040 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
2b050 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
2b060 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
2b070 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
2b080 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
2b090 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
2b0a0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
2b0b0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b0c0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
2b0d0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
2b0e0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
2b0f0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b110 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
2b120 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
2b130 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
2b140 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2b150 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
2b160 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2b170 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
2b180 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
2b190 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
2b1a0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
2b1b0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2b1c0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2b1d0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b1e0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
2b1f0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2b200 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b210 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
2b220 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2b230 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2b240 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
2b250 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2b260 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2b270 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
2b280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b290 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
2b2a0 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
2b2b0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2b2c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b2e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2b2f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2b300 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
2b310 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2b320 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  de;.  }..  PAGER
2b330 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
2b340 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
2b350 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
2b360 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
2b370 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b380 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
2b390 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f  ->dbSize));..  /
2b3a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2b3b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
2b3c0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
2b3d0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
2b3e0 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
2b3f0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b400 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
2b410 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
2b420 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26  */.  if( MEMDB &
2b430 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  & pPager->dbModi
2b440 66 69 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  fied ){.    sqli
2b450 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
2b460 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2b470 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2b480 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
2b490 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
2b4a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2b4b0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   ){..    /* The 
2b4c0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2b4d0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
2b4e0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
2b4f0 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a  tly how it.    *
2b500 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
2b510 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
2b520 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
2b530 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
2b540 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20  tion.    ** was 
2b550 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2b560 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
2b570 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2b580 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
2b590 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
2b5a0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
2b5b0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a  peration: .    *
2b5c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68  *.    **    * Th
2b5d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2b5e0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
2b5f0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
2b600 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20   for.    **     
2b610 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
2b620 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
2b630 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73      **    * This
2b640 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
2b650 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
2b660 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
2b670 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a   and.    **    *
2b680 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
2b690 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
2b6a0 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
2b6b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b6c0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2b6d0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2b6e0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61  tion was not ena
2b6f0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2b700 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  time, then the. 
2b710 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
2b720 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2b730 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2b740 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
2b750 65 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  e change.    ** 
2b760 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
2b770 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
2b780 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2b790 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
2b7a0 75 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ut.    ** is not
2b7b0 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
2b7c0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
2b7d0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
2b7e0 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
2b7f0 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
2b800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b810 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
2b820 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
2b830 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61  n call.    ** pa
2b840 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2b850 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
2b860 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
2b870 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63  unter in indirec
2b880 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a  t.    ** mode. .
2b890 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
2b8a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2b8b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2b8c0 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64  both enabled and
2b8d0 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20   applicable,.   
2b8e0 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
2b8f0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2b900 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
2b910 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
2b920 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20  unter.    ** in 
2b930 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
2b940 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2b950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
2b960 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a  l never be.    *
2b970 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
2b980 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
2b990 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
2b9a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2b9b0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48  IC_WRITE.    PgH
2b9c0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
2b9d0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2b9e0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
2b9f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2ba00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2ba10 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
2ba20 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73  ( !zMaster && is
2ba30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ba40 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2ba50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
2ba60 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
2ba70 61 67 65 72 29 20 0a 20 20 20 20 20 26 26 20 70  ager) .     && p
2ba80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
2ba90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2baa0 65 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70  e.     && (0==(p
2bab0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
2bac0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2bad0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
2bae0 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
2baf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2bb00 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
2bb10 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
2bb20 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63  er via the direc
2bb30 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20  t-write method. 
2bb40 54 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  The .      ** fo
2bb50 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
2bb60 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
2bb70 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
2bb80 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
2bb90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63  .      ** to inc
2bba0 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
2bbb0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2bbc0 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
2bbd0 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20  age 1 .      ** 
2bbe0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
2bbf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42  database file. B
2bc00 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
2bc10 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20  omic-write .    
2bc20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66    ** property of
2bc30 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73   the host file-s
2bc40 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73  ystem, this is s
2bc50 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  afe..      */.  
2bc60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2bc70 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bc80 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
2bc90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2bca0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2bcb0 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
2bcc0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
2bcd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bce0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2bcf0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2bd00 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2bd10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2bd20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  }.#else.    rc =
2bd30 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bd40 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2bd50 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
2bd60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bd70 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2bd80 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2bd90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2bda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2bdb0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
2bdc0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
2bdd0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a   all pages.    *
2bde0 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
2bdf0 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
2be00 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
2be10 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2be20 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  al.    ** file. 
2be30 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2be40 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
2be50 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a  uum mode..    **
2be60 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72  .    ** Before r
2be70 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73  eading the pages
2be80 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2be90 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  rs larger than t
2bea0 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  he .    ** curre
2beb0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
2bec0 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
2bed0 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
2bee0 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68   value.    ** th
2bef0 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68  at it took at th
2bf00 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
2bf10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65  ransaction. Othe
2bf20 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a  rwise, the.    *
2bf30 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
2bf40 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
2bf50 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
2bf60 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
2bf70 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61   ** reading data
2bf80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2bf90 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2bfa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2bfb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2bfc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2bfd0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
2bfe0 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 26 26  OrigSize.     &&
2bff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c000 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2c010 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
2c020 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   ){.      Pgno i
2c030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2c060 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2c070 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
2c080 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
2c090 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
2c0a0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
2c0b0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2c0c0 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50  Pgno dbSize = pP
2c0d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20  ager->dbSize;   
2c0e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2c0f0 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20  image size */ . 
2c100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2c110 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2c120 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
2c130 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b  for( i=dbSize+1;
2c140 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72   i<=pPager->dbOr
2c150 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  igSize; i++ ){. 
2c160 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
2c170 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
2c180 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c190 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
2c1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
2c1b0 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20  Hdr *pPage;     
2c1c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2c1d0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
2c1e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c1f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2c200 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
2c210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c220 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c230 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c240 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2c250 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c260 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2c270 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
2c280 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2c290 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c2a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c2b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c2c0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c2d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c2e0 20 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65    } .      pPage
2c2f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
2c300 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ze;.    }.#endif
2c310 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
2c320 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2c330 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
2c340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2c350 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a   a master .    *
2c360 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
2c370 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
2c380 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2c390 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c3a0 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  , .    ** or if 
2c3b0 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20  zMaster is NULL 
2c3c0 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  (no master journ
2c3d0 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63  al), then this c
2c3e0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2c3f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2c400 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
2c410 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
2c420 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2c430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c440 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2c450 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2c460 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2c470 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
2c480 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2c490 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
2c4a0 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20  ng.    ** used, 
2c4b0 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  this call will n
2c4c0 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f  ot create the jo
2c4d0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65  urnal file or pe
2c4e0 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a  rform any.    **
2c4f0 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f   real IO..    */
2c500 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  .    rc = syncJo
2c510 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2c520 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c530 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2c540 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2c550 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  t;..    /* Write
2c560 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2c570 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c580 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63   file. */.    rc
2c590 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2c5a0 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
2c5b0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2c5c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2c5d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c5e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c5f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2c600 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2c610 44 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  D );.      goto 
2c620 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c630 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2c640 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
2c650 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
2c660 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a  PCache);..    /*
2c670 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
2c680 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20  disk is not the 
2c690 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
2c6a0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2c6b0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65  .    ** then use
2c6c0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
2c6d0 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
2c6e0 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
2c6f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c700 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
2c710 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2c720 7a 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ze ){.      Pgno
2c730 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
2c740 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
2c750 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
2c760 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
2c770 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c780 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2c790 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2c7a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2c7b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
2c7c0 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  er, nNew);.     
2c7d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c7e0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c7f0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
2c810 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
2c820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c830 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
2c840 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
2c850 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
2c860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2c870 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
2c880 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
2c890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
2c8a0 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
2c8b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
2c8c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2c8d0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
2c8e0 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
2c8f0 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69  se_one_exit:.  i
2c900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2c910 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
2c920 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
2c930 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2c940 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2c950 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
2c960 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  ive.    ** lock 
2c970 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
2c980 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
2c990 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
2c9a0 20 73 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20 74   since .    ** t
2c9b0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
2c9c0 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
2c9d0 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
2c9e0 69 73 0a 20 20 20 20 2a 2a 20 62 65 74 74 65 72  is.    ** better
2c9f0 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
2ca00 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a  E_BUSY..    **/.
2ca10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ca20 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
2ca30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2ca40 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2ca50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2ca60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ca70 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2ca80 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2ca90 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2caa0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2cab0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2cac0 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2cad0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2cae0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2caf0 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2cb00 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2cb10 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2cb20 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2cb30 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2cb40 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2cb50 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2cb60 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2cb70 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2cb80 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2cb90 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2cba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2cbb0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2cbc0 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2cbd0 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2cbe0 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2cbf0 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2cc00 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2cc10 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2cc20 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2cc30 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2cc40 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2cc50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2cc60 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2cc70 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2cc80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2cc90 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2cca0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2ccb0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2ccc0 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2ccd0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2cce0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2ccf0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2cd00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cd10 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2cd20 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2cd30 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2cd40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2cd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cd60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2cd70 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  /* Do not procee
2cd80 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
2cd90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2cda0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
2cdb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2cdc0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
2cdd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2cde0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
2cdf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2ce00 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2ce10 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2ce20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
2ce30 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
2ce40 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
2ce50 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
2ce60 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
2ce70 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
2ce80 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
2ce90 73 20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f 63  s defensive bloc
2cea0 6b 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  k here anyway.. 
2ceb0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2cec0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2ced0 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 7b  GER_RESERVED) ){
2cee0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cef0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2cf00 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
2cf10 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
2cf20 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
2cf30 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
2cf40 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
2cf50 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2cf60 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2cf70 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2cf80 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
2cf90 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
2cfa0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
2cfb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2cfc0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
2cfd0 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
2cfe0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cff0 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
2d000 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
2d010 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2d020 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
2d030 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
2d040 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
2d050 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
2d060 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
2d070 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
2d080 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
2d090 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
2d0a0 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
2d0b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d0c0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
2d0d0 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
2d0e0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d0f0 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
2d100 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
2d110 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
2d120 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
2d130 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
2d140 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
2d150 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2d160 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
2d170 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2d180 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
2d190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2d1a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2d1b0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
2d1c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2d1d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2d1e0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
2d1f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
2d200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d210 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2d220 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE(("COMMIT %d\n
2d230 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2d240 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
2d250 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2d260 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
2d270 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
2d280 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2d290 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2d2a0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2d2b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2d2c0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
2d2d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2d2e0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
2d2f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
2d300 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74  changes. The dat
2d310 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
2d320 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
2d330 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mode..**.** Thi
2d340 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
2d350 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a  rms two tasks:.*
2d360 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c  *.**   1) It rol
2d370 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  ls back the jour
2d380 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72  nal file, restor
2d390 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ing all database
2d3a0 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20   file and .**   
2d3b0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63     in-memory cac
2d3c0 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  he pages to the 
2d3d0 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20  state they were 
2d3e0 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  in when the tran
2d3f0 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  saction.**      
2d400 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a  was opened, and.
2d410 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c  **   2) It final
2d420 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2d430 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69   file, so that i
2d440 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
2d450 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f  r hot.**      ro
2d460 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f  llback at any po
2d470 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2d480 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74  e..**.** subject
2d490 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2d4a0 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73  g qualifications
2d4b0 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  :.**.** * If the
2d4c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2d4d0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68   not yet open wh
2d4e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2d4f0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
2d500 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69   then only (2) i
2d510 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20  s performed. In 
2d520 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2d530 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  is no journal fi
2d540 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20  le.**   to roll 
2d550 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  back..**.** * If
2d560 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2d570 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
2d580 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20  LITE_FULL, then 
2d590 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20  task (1) is .** 
2d5a0 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20    performed. If 
2d5b0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b  successful, task
2d5c0 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73   (2). Regardless
2d5d0 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a   of the outcome.
2d5e0 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20  **   of either, 
2d5f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2d600 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2d610 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
2d620 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ller.**   (i.e. 
2d630 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
2d640 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  ERR or SQLITE_CO
2d650 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20  RRUPT)..**.** * 
2d660 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2d670 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  in PAGER_RESERVE
2d680 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  D state, then at
2d690 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68  tempt (1). Wheth
2d6a0 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28  er.**   or not (
2d6b0 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75 6c  1) is succussful
2d6c0 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28  , also attempt (
2d6d0 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  2). If successfu
2d6e0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53  l, return.**   S
2d6f0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2d700 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65  ise, enter the e
2d710 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2d720 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
2d730 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65  .**   error code
2d740 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a   encountered. .*
2d750 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2d760 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2d770 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
2d780 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69  database was wri
2d790 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53  tten to. .**   S
2d7a0 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e  o is safe to fin
2d7b0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2d7c0 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74  l file even if t
2d7d0 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20  he playback .** 
2d7e0 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20    (operation 1) 
2d7f0 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20  failed. However 
2d800 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65  the pager must e
2d810 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2d820 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65  tate.**   as the
2d830 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d840 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2d850 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74   are now suspect
2d860 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c  ..**.** * Finall
2d870 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45  y, if in PAGER_E
2d880 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
2d890 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2d8a0 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65  . Only.**   atte
2d8b0 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69  mpt (2) if (1) i
2d8c0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65  s successful. Re
2d8d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2d8e0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2d8f0 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74     otherwise ent
2d900 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2d910 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2d920 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  e error code fro
2d930 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c  m the .**   fail
2d940 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ing operation..*
2d950 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2d960 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ase the database
2d970 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62   file may have b
2d980 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  een written to. 
2d990 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70  So if the.**   p
2d9a0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
2d9b0 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65  n did not succee
2d9c0 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  d it would not b
2d9d0 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  e safe to finali
2d9e0 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  ze.**   the jour
2d9f0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65  nal file. It nee
2da00 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e  ds to be left in
2da10 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2da20 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f   so that.**   so
2da30 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
2da40 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72   can use it to r
2da50 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
2da60 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a  ase state (by.**
2da70 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72     hot-journal r
2da80 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74  ollback)..*/.int
2da90 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2daa0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
2dab0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2dac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dae0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2daf0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f   PAGERTRACE(("RO
2db00 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
2db10 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2db20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2db30 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69  dbModified || !i
2db40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2db50 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  d) ){.    rc = p
2db60 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2db70 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2db80 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2db90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2dba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
2dbb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
2dbc0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
2dbd0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2dbe0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2dbf0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
2dc00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2dc10 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2dc20 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2dc30 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2dc40 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2dc50 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2dc60 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
2dc70 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
2dc80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2dc90 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2dca0 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
2dcb0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2dcc0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2dcd0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2dce0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dcf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dd00 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
2dd10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2dd20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2dd30 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2dd40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
2dd50 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2dd60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2dd70 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
2dd80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
2dd90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
2dda0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
2ddb0 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
2ddc0 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
2ddd0 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
2dde0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
2ddf0 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
2de00 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
2de10 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
2de20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
2de30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2de40 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2de50 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
2de60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2de70 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2de80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2de90 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
2dea0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
2deb0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
2dec0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
2ded0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
2dee0 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
2def0 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
2df00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2df10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
2df20 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
2df30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2df40 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2df50 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
2df60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2df70 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
2df80 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2df90 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
2dfa0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2dfb0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
2dfc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2dfd0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2dfe0 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
2dff0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
2e000 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
2e010 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
2e020 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
2e030 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e040 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
2e050 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
2e060 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
2e070 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2e080 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
2e090 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
2e0a0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
2e0b0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
2e0c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e0d0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
2e0e0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
2e0f0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2e100 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e110 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
2e120 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
2e130 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e140 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
2e150 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
2e160 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
2e170 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2e180 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
2e190 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
2e1a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2e1b0 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
2e1c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
2e1d0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
2e1e0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
2e1f0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
2e200 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
2e210 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
2e220 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
2e230 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
2e240 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
2e250 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
2e260 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
2e270 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
2e280 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2e290 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2e2a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2e2b0 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69  mory pager..*/.i
2e2c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
2e2d0 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50  sMemdb(Pager *pP
2e2e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2e2f0 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MEMDB;.}../*.** 
2e300 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  Check that there
2e310 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53   are at least nS
2e320 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69  avepoint savepoi
2e330 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65  nts open. If the
2e340 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  re are.** curren
2e350 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53  tly less than nS
2e360 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20  avepoints open, 
2e370 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72  then open one or
2e380 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
2e390 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74  .** to make up t
2e3a0 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49  he difference. I
2e3b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2e3c0 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c  savepoints is al
2e3d0 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74  ready.** equal t
2e3e0 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68  o nSavepoint, th
2e3f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2e400 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2e410 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
2e420 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
2e430 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
2e440 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2e450 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2e460 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20  s while opening 
2e470 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2e480 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f  file, then an IO
2e490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a   error code is.*
2e4a0 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  * returned. Othe
2e4b0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2e4c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e4d0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
2e4e0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e4f0 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74  , int nSavepoint
2e500 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2e510 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e530 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e540 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20  .  int nCurrent 
2e550 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  = pPager->nSavep
2e560 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
2e570 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
2e580 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  f savepoints */.
2e590 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
2e5a0 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50  t>nCurrent && pP
2e5b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e5c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5f0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2e600 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65  able */.    Page
2e610 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
2e620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e630 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72      /* New Pager
2e640 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2e650 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74  y */..    /* Eit
2e660 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20  her there is no 
2e670 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f  active journal o
2e680 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  r the sub-journa
2e690 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20  l is open or .  
2e6a0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2e6b0 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65   is always store
2e6c0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  d in memory */. 
2e6d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e6e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2e6f0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2e700 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20  r->sjfd) ||.    
2e710 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2e720 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2e730 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2e740 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a  EMORY );..    /*
2e750 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e   Grow the Pager.
2e760 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
2e770 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29   using realloc()
2e780 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2e790 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20  NOMEM.    ** if 
2e7a0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
2e7b0 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ails. Otherwise,
2e7c0 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f   zero the new po
2e7d0 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20  rtion in case a 
2e7e0 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66  .    ** malloc f
2e7f0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
2e800 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  ile populating i
2e810 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e  t in the for(...
2e820 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20  ) loop below..  
2e830 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20    */.    aNew = 
2e840 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20  (PagerSavepoint 
2e850 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
2e860 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
2e870 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69  ->aSavepoint, si
2e880 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2e890 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a  int)*nSavepoint.
2e8a0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2e8b0 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  aNew ){.      re
2e8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e8d0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
2e8e0 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65  set(&aNew[nCurre
2e8f0 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f  nt], 0, (nSavepo
2e900 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20  int-nCurrent) * 
2e910 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2e920 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61  point));.    pPa
2e930 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
2e940 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67  = aNew;.    pPag
2e950 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2e960 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20   nSavepoint;..  
2e970 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
2e980 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2e990 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74   structures just
2e9a0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
2e9b0 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65     for(ii=nCurre
2e9c0 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e  nt; ii<nSavepoin
2e9d0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
2e9e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e9f0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
2ea00 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f       aNew[ii].nO
2ea10 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  rig = pPager->db
2ea20 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2ea30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2ea40 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
2ea50 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20  ournalOff>0 ){. 
2ea60 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
2ea70 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  iOffset = pPager
2ea80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2ea90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eaa0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
2eab0 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  set = JOURNAL_HD
2eac0 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
2ead0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77      }.      aNew
2eae0 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70  [ii].iSubRec = p
2eaf0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a  Pager->nSubRec;.
2eb00 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70        aNew[ii].p
2eb10 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71  InSavepoint = sq
2eb20 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2eb30 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
2eb40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
2eb50 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2eb60 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
2eb70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2eb80 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2eb90 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  }..    /* Open t
2eba0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2ebb0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
2ebc0 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  eady opened. */.
2ebd0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2ebe0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2ebf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2ec00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2ec10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ec20 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
2ec30 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
2ec40 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
2ec50 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2ec60 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
2ec70 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
2ec80 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
2ec90 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
2eca0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
2ecb0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
2ecc0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
2ecd0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
2ece0 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
2ecf0 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
2ed00 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2ed10 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
2ed20 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
2ed30 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
2ed40 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
2ed50 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
2ed60 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
2ed70 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
2ed80 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2ed90 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
2eda0 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
2edb0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2edc0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
2edd0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
2ede0 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
2edf0 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
2ee00 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2ee10 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
2ee20 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
2ee30 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
2ee40 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
2ee50 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2ee60 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
2ee70 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
2ee80 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
2ee90 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
2eea0 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
2eeb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2eec0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2eed0 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
2eee0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2eef0 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
2ef00 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
2ef10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ef20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2ef30 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
2ef40 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
2ef50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2ef60 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2ef70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2ef80 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
2ef90 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
2efa0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
2efb0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
2efc0 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
2efd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2efe0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
2eff0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2f000 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
2f010 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
2f020 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
2f030 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2f040 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2f050 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
2f060 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
2f070 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
2f080 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
2f090 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
2f0a0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
2f0b0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
2f0c0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2f0d0 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
2f0e0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f0f0 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
2f100 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
2f110 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
2f120 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
2f130 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2f140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f150 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
2f160 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2f170 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
2f180 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
2f190 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f1a0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
2f1b0 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
2f1c0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
2f1d0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
2f1e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2f1f0 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
2f200 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
2f210 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
2f220 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
2f230 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2f240 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2f250 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
2f260 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
2f270 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f280 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
2f290 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
2f2a0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
2f2b0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
2f2c0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
2f2d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f2e0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f300 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2f310 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
2f320 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2f330 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
2f340 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
2f350 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
2f360 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2f370 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
2f380 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
2f390 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
2f3a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
2f3b0 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
2f3c0 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
2f3d0 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
2f3e0 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
2f3f0 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
2f400 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
2f410 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
2f420 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
2f430 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
2f440 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
2f450 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
2f460 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
2f470 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c  for(ii=nNew; ii<
2f480 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2f490 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2f4a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2f4b0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
2f4c0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
2f4d0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
2f4e0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  }.    pPager->nS
2f4f0 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b  avepoint = nNew;
2f500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2f510 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
2f520 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
2f530 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
2f540 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
2f550 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
2f560 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
2f570 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
2f580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f590 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
2f5a0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
2f5b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f5c0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
2f5d0 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
2f5e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2f5f0 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
2f600 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
2f610 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
2f620 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70     */.    if( op
2f630 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f640 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28 70  BACK && isOpen(p
2f650 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2f660 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
2f670 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20  int *pSavepoint 
2f680 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70  = (nNew==0)?0:&p
2f690 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2f6a0 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20  t[nNew-1];.     
2f6b0 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62   rc = pagerPlayb
2f6c0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61  ackSavepoint(pPa
2f6d0 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29  ger, pSavepoint)
2f6e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72  ;.      assert(r
2f6f0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b  c!=SQLITE_DONE);
2f700 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2f710 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2f720 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lease of the out
2f730 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
2f740 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20  , truncate .    
2f750 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
2f760 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  al to zero bytes
2f770 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20   in size. */.   
2f780 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20   if( nNew==0 && 
2f790 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f7a0 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e 28  LEASE && isOpen(
2f7b0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2f7c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2f7d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2f7e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f7f0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
2f800 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20  ger->sjfd, 0);. 
2f810 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75       pPager->nSu
2f820 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  bRec = 0;.    }.
2f830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2f850 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2f860 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2f870 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
2f880 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
2f890 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
2f8a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2f8b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
2f8c0 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
2f8d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53  * Return the VFS
2f8e0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
2f8f0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e  he pager..*/.con
2f900 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  st sqlite3_vfs *
2f910 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
2f920 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2f930 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2f940 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pVfs;.}../*.** 
2f950 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20  Return the file 
2f960 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64  handle for the d
2f970 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
2f980 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
2f990 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
2f9a0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55   might return NU
2f9b0 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68  LL if the file h
2f9c0 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65  as.** not yet be
2f9d0 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71  en opened..*/.sq
2f9e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69  lite3_file *sqli
2f9f0 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67  te3PagerFile(Pag
2fa00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2fa10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
2fa20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2fa30 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
2fa40 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2fa50 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
2fa60 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
2fa70 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
2fa80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2fa90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2faa0 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
2fab0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2fac0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
2fad0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
2fae0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
2faf0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2fb00 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
2fb10 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
2fb20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fb30 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
2fb40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2fb50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
2fb60 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
2fb70 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
2fb80 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
2fb90 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
2fba0 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
2fbb0 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
2fbc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2fbd0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
2fbe0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
2fbf0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
2fc00 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
2fc10 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
2fc20 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
2fc30 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
2fc40 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
2fc50 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
2fc60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2fc70 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
2fc80 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
2fc90 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
2fca0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
2fcb0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
2fcc0 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
2fcd0 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
2fce0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
2fcf0 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
2fd00 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
2fd10 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
2fd20 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
2fd30 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
2fd40 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
2fd50 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
2fd60 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
2fd70 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
2fd80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
2fd90 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
2fda0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
2fdb0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
2fdc0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2fdd0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
2fde0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
2fdf0 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
2fe00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2fe10 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
2fe20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
2fe30 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
2fe40 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
2fe50 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
2fe60 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
2fe70 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
2fe80 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
2fe90 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
2fea0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
2feb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2fec0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
2fed0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
2fee0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
2fef0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
2ff00 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
2ff10 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
2ff20 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
2ff30 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
2ff40 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
2ff50 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
2ff60 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
2ff70 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
2ff80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
2ff90 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
2ffa0 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
2ffb0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
2ffc0 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
2ffd0 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
2ffe0 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
2fff0 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
30000 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
30010 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
30020 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
30030 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
30040 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
30050 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
30060 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
30070 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
30080 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
30090 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
300a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
300b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
300c0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
300d0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
300e0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
300f0 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
30100 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urs. Otherwise, 
30110 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
30120 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
30130 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
30140 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
30150 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
30160 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
30170 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
30180 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20  *pPgOld;        
30190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
301a0 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
301b0 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
301c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
301d0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76  ;       /* Old v
301e0 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e  alue of pPg->pgn
301f0 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65  o, if sync is re
30200 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
30210 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30230 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
30240 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20  o origPgno;     
30250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30260 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e   original page n
30270 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  umber */..  asse
30280 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
30290 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
302a0 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64  page being moved
302b0 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61   is dirty and ha
302c0 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64  s not been saved
302d0 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20   by the latest. 
302e0 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74   ** savepoint, t
302f0 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72  hen save the cur
30300 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
30310 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
30320 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
30330 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69  rnal now. This i
30340 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  s required to ha
30350 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ndle the followi
30360 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a  ng scenario:.  *
30370 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a  *.  **   BEGIN;.
30380 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
30390 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d  l page X, then m
303a0 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f  odify it in memo
303b0 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56  ry>.  **     SAV
303c0 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a  EPOINT one;.  **
303d0 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67         <Move pag
303e0 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  e X to location 
303f0 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  Y>.  **     ROLL
30400 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a  BACK TO one;.  *
30410 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58  *.  ** If page X
30420 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65   were not writte
30430 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
30440 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f  rnal here, it wo
30450 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
30460 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74  possible to rest
30470 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ore its contents
30480 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
30490 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a  ACK TO one".  **
304a0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20   statement were 
304b0 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  is processed..  
304c0 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e  **.  ** subjourn
304d0 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65  alPage() may nee
304e0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
304f0 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67  ace to store pPg
30500 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a  ->pgno into.  **
30510 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
30520 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20  epoint bitvecs. 
30530 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73  This is the reas
30540 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  on this function
30550 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e  .  ** may return
30560 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20   SQLITE_NOMEM.. 
30570 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
30580 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
30590 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75   .   && subjRequ
305a0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
305b0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
305c0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
305d0 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20  age(pPg)).  ){. 
305e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
305f0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
30600 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
30610 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
30620 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
30630 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
30640 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
30650 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
30660 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
30670 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49  1:0, pgno));.  I
30680 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
30690 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
306a0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
306b0 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68  no))..  /* If th
306c0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
306d0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
306e0 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
306f0 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
30700 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
30710 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
30720 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
30730 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
30740 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
30750 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
30760 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
30770 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
30780 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
30790 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
307a0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
307b0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
307c0 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
307d0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
307e0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
307f0 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
30800 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
30810 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
30820 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
30830 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
30840 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
30850 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
30860 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
30870 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
30880 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
30890 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
308a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
308b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
308c0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
308d0 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
308e0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
308f0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
30900 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
30910 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
30920 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
30930 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
30940 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
30950 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
30960 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
30970 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
30980 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
30990 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
309a0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
309b0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
309c0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
309d0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
309e0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
309f0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
30a00 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
30a10 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
30a20 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
30a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
30a40 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
30a50 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
30a60 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
30a70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
30a80 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
30a90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
30aa0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
30ab0 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d  rop(pPgOld);.  }
30ac0 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70  ..  origPgno = p
30ad0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69  Pg->pgno;.  sqli
30ae0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
30af0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69  g, pgno);.  sqli
30b00 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
30b10 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
30b20 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
30b30 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
30b40 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
30b50 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
30b60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
30b70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30b80 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
30b90 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
30ba0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
30bb0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
30bc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
30bd0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
30be0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
30bf0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
30c00 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
30c10 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
30c20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72  .    ** "is jour
30c30 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c  naled" bitvec fl
30c40 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ag has been set.
30c50 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
30c60 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20  e remedied by.  
30c70 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65    ** loading the
30c80 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
30c90 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
30ca0 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
30cb0 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
30cc0 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  * flag..    **. 
30cd0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74     ** If the att
30ce0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65  empt to load the
30cf0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
30d00 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c  age-cache fails,
30d10 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20   (due.    ** to 
30d20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
30d30 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72   failure), clear
30d40 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20   the bit in the 
30d50 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20  pInJournal[].   
30d60 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72   ** array. Other
30d70 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67  wise, if the pag
30d80 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
30d90 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e  written again in
30da0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61  .    ** this tra
30db0 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
30dc0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
30dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30de0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
30df0 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f  t is synced into
30e00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30e10 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20  e. This way, it 
30e20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20  may end up in.  
30e30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
30e40 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74   file twice, but
30e50 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
30e60 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20  roblem..    **. 
30e70 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
30e80 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
30e90 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
30ea0 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
30eb0 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
30ec0 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
30ed0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
30ee0 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
30ef0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
30f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30f10 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
30f20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
30f30 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
30f40 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
30f50 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
30f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30f70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
30f80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
30f90 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   && needSyncPgno
30fa0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
30fb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
30fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30fd0 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
30fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30ff0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
31000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
31010 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
31020 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
31030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31040 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31050 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
31060 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
31070 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
31080 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
31090 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
310a0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
310b0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
310c0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
310d0 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
310e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
310f0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
31100 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
31110 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
31120 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
31130 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
31140 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
31150 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
31160 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
31170 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
31180 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c  ll back.  We all
31190 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
311a0 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64  age now, instead
311b0 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c   of at rollback,
311c0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20   because we can 
311d0 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a  better deal.  **
311e0 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
311f0 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77  memory error now
31200 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e  .  Ticket #3761.
31210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
31220 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  B ){.    DbPage 
31230 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20  *pNew;.    rc = 
31240 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
31250 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67  ire(pPager, orig
31260 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b  Pgno, &pNew, 1);
31270 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31280 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
31290 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  rc;.    sqlite3P
312a0 61 67 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b  agerUnref(pNew);
312b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
312c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
312d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
312e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
312f0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
31300 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
31310 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
31320 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
31330 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
31340 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
31350 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
31360 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
31370 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
31380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
31390 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
313a0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
313b0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
313c0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
313d0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
313e0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
313f0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
31400 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
31410 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
31420 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
31430 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
31440 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d  urn (pPager?pPg-
31450 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f  >pExtra:0);.}../
31460 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
31470 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
31480 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
31490 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
314a0 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
314b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
314c0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
314d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
314e0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
314f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
31500 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
31510 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
31520 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
31530 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
31540 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
31550 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
31560 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
31570 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
31580 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31590 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
315a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
315b0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
315c0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
315d0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
315e0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
315f0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
31600 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
31610 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
31620 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
31630 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
31640 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
31650 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
31660 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31670 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
31680 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
31690 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
316a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
316b0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
316c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
316d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
316e0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
316f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31700 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
31710 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31720 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
31730 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
31740 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
31750 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
31760 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
31770 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
31780 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
31790 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
317a0 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
317b0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
317c0 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
317d0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
317e0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
317f0 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
31800 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
31810 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20  MODE_QUERY.**   
31820 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31830 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
31840 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31850 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
31860 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31870 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
31880 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31890 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47  DE_OFF.**    PAG
318a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
318b0 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74  EMORY.**.** If t
318c0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
318d0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
318e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
318f0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
31900 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  ** value specifi
31910 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  ed if the change
31920 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68   is allowed.  Th
31930 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61  e change is disa
31940 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68  llowed.** for th
31950 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
31960 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
31970 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
31980 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
31990 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
319a0 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
319b0 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
319c0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
319d0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  The journal mode
319e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
319f0 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e  ged while a tran
31a00 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
31a10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
31a20 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
31a30 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
31a40 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
31a50 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
31a60 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
31a70 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
31a80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
31a90 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
31aa0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
31ab0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
31ac0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31ad0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31ae0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
31af0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31b00 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31b10 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
31b20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31b30 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31b40 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
31b50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31b60 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31b70 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
31b80 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31b90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31ba0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
31bb0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
31bc0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
31bd0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
31be0 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44  >=0.   && (!MEMD
31bf0 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45  B || eMode==PAGE
31c00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
31c10 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
31c20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
31c30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31c40 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67  OFF).   && !pPag
31c50 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20  er->dbModified. 
31c60 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50    && (!isOpen(pP
31c70 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d  ager->jfd) || 0=
31c80 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
31c90 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  Off).  ){.    if
31ca0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31cb0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73  >jfd) ){.      s
31cc0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
31cd0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31ce0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  }.    pPager->jo
31cf0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
31d00 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
31d10 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
31d20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
31d30 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
31d40 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
31d50 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
31d60 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
31d70 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
31d80 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
31d90 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
31da0 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
31db0 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
31dc0 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
31dd0 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
31de0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
31df0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
31e00 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
31e10 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
31e20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
31e30 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
31e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31e50 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
31e60 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
31e70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31e80 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
31e90 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
31ea0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
31eb0 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
31ec0 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
31ed0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
31ee0 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
31ef0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
31f00 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
31f10 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
31f20 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
31f30 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
31f40 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
31f50 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
31f60 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
31f70 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
31f80 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
31f90 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
31fa0 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
31fb0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
31fc0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
31fd0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
31fe0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
31ff0 2a 2f 0a                                         */.