/ Hex Artifact Content
Login

Artifact 1ad2dff309c92fbf0a7a2017ece5407d05b19937:


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 36 31  : pager.c,v 1.61
0350: 36 20 32 30 30 39 2f 30 37 2f 32 34 20 31 39 3a  6 2009/07/24 19:
0360: 30 31 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a  01:19 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 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 29  NALMODE_DELETE )
cdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
cdc0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cdd0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
cde0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ce00: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
ce10: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
ce20: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
ce50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
ce60: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
ce70: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
ce80: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
ce90: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
cea0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  ;.#endif..    sq
ceb0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
cec0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
ced0: 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  che);.    sqlite
cee0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
cef0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf00: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cf10: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cf20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
cf30: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
cf40: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
cf50: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
cf60: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
cf70: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
cf80: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
cf90: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cfa0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50  R_SHARED;.    pP
cfb0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
cfc0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tDone = 0;.  }el
cfd0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
cfe0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
cff0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
d000: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d010: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
d020: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
d030: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
d040: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d050: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
d060: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  fied = 0;..  /* 
d070: 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70  TODO: Is this op
d080: 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68  timal? Why is th
d090: 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69  e db size invali
d0a0: 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a  dated here .  **
d0b0: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
d0c0: 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75  se file is not u
d0d0: 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50  nlocked? */.  pP
d0e0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
d0f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
d100: 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
d110: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
d120: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
d130: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
d140: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d150: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
d160: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d170: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
d190: 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
d1a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
d1b0: 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
d1c0: 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
d1d0: 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
d1e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
d1f0: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
d200: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
d210: 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
d220: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
d230: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
d240: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d250: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
d260: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
d270: 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
d280: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
d290: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
d2a0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
d2b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d2c0: 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
d2d0: 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
d2e0: 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
d2f0: 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
d300: 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
d310: 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
d320: 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
d330: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
d340: 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
d350: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
d360: 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
d370: 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
d380: 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
d390: 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
d3a0: 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
d3b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
d3c0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
d3d0: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
d3e0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d3f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d400: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d410: 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
d420: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d430: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d440: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d450: 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
d460: 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
d470: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d480: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d490: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d4a0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d4b0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d4c0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d4d0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d4e0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d4f0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d500: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d510: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d520: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
d540: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
d550: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
d560: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
d570: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
d580: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
d590: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
d5a0: 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
d5b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
d5c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
d5d0: 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
d5e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d5f0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d600: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d610: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d620: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d630: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
d640: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d650: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
d660: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
d670: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
d680: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
d690: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
d6a0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
d6b0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
d6c0: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
d6d0: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
d6e0: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
d6f0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
d700: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
d710: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
d720: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
d730: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
d740: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
d760: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
d770: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
d780: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d790: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
d7a0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
d7b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d7c0: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
d7d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
d7e0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
d7f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d800: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
d810: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
d830: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
d840: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
d860: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d870: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d880: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
d890: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
d8a0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
d8b0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d8d0: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
d8e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
d8f0: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
d900: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
d910: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
d920: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
d930: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
d940: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
d950: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
d960: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
d970: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
d980: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
d990: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
d9a0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
d9b0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
d9c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
d9d0: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
d9e0: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
d9f0: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
da00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
da10: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
da20: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
da30: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
da40: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
da50: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
da60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
da70: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
da80: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
da90: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
daa0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
dab0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
dac0: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
dad0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
dae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
daf0: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
db00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
db10: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
db20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
db30: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
db40: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
db50: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
db60: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
db70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
db80: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
db90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
dba0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
dbb0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
dbc0: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
dbd0: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
dbe0: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
dbf0: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
dc00: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
dc10: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
dc20: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
dc30: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
dc40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
dc50: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
dc60: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
dc70: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
dc80: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
dc90: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
dca0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
dcb0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
dcc0: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
dcd0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
dce0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
dcf0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd00: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
dd10: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
dd20: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
dd30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
dd40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
dd50: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
dd60: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
dd70: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
dd80: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
dd90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dda0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
ddb0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dde0: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
ddf0: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
de00: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
de30: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
de40: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
de50: 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20  sUnsync,        
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
de70: 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   if reading from
de80: 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a   unsynced main j
de90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
dea0: 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
dec0: 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
ded0: 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69   playback */.  i
dee0: 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20  nt isSavepnt,   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df00: 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
df10: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
df20: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
df50: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
df60: 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ed back */.){.  
df70: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
df80: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
df90: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
dfa0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
dfb0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
dfc0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dfe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
dff0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
e000: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
e010: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
e020: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e030: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
e040: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
e050: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e070: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
e080: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
e090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
e0a0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
e0c0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
e0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e0e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
e0f0: 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
e100: 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
e110: 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
e120: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
e130: 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
e140: 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
e150: 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
e160: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
e170: 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
e180: 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
e190: 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
e1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
e1b0: 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
e1c0: 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
e1d0: 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
e1e0: 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
e1f0: 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
e200: 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61  aData = (u8*)pPa
e210: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
e220: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
e230: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
e240: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
e250: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e260: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a  n allocated */..
e270: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
e280: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
e290: 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
e2a0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
e2b0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e2c0: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
e2d0: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
e2e0: 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
e2f0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
e300: 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
e310: 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
e320: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
e330: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
e340: 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
e350: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
e360: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
e380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e390: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
e3a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e3b0: 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
e3c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e3d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e3e0: 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
e3f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
e400: 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
e410: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
e420: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
e430: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
e440: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
e450: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
e460: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
e470: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
e480: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
e490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
e4a0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
e4b0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
e4c0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
e4d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
e4f0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
e500: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
e510: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
e520: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
e530: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
e540: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
e550: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
e560: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
e570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e580: 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
e5b0: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
e5c0: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
e5d0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
e5e0: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
e5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e600: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
e610: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
e620: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
e630: 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
e640: 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
e650: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e660: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
e670: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
e680: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
e690: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
e6a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e6b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
e6c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
e6d0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
e6e0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
e6f0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
e700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
e710: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
e720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
e730: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
e740: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
e750: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e760: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
e770: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e780: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
e790: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
e7a0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
e7b0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
e7c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e7d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
e7e0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
e7f0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
e800: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
e810: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
e820: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
e830: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
e840: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
e850: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
e860: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e870: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e880: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e890: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e8a0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e8b0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e8c0: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e8d0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e8e0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e8f0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e900: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e910: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e920: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e930: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e940: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e950: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e960: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e970: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e980: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e990: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e9a0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e9b0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e9c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e9d0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e9e0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e9f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
ea00: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
ea10: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
ea20: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
ea30: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
ea40: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
ea50: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
ea60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ea70: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
ea80: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
ea90: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
eaa0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
eab0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
eac0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ead0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
eae0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
eaf0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
eb00: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
eb10: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
eb20: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
eb30: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
eb40: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
eb50: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
eb60: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
eb70: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
eb80: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
eb90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
eba0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
ebb0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
ebc0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
ebd0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ebe0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
ebf0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
ec00: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
ec10: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
ec20: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
ec30: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
ec40: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
ec50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
ec60: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
ec70: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
ec80: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
ec90: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
eca0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
ecb0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
ecc0: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
ecd0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
ece0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
ecf0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
ed00: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
ed10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
ed20: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
ed30: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
ed40: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
ed50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
ed60: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
ed70: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
ed80: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
ed90: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
eda0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
edb0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
edc0: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
edd0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
ede0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
edf0: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
ee00: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
ee10: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
ee20: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
ee30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
ee40: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
ee50: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
ee60: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
ee70: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
ee80: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
ee90: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
eea0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
eeb0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
eec0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
eed0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
eee0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
eef0: 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
ef00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
ef10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ef20: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
ef30: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
ef40: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
ef50: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
ef60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
ef70: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
ef80: 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
ef90: 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
efa0: 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
efb0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
efc0: 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  ));.  if( (pPage
efd0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
efe0: 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26  EXCLUSIVE).   &&
eff0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
f000: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
f010: 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20  _NEED_SYNC)).   
f020: 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
f030: 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55  ->fd).   && !isU
f040: 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69  nsync.  ){.    i
f050: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
f060: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
f070: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
f080: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f090: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
f0a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f0b0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
f0c0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
f0d0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
f0e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
f0f0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
f100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f110: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
f120: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
f130: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f140: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
f150: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
f160: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
f170: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
f180: 6b 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  kup, pgno, aData
f190: 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
f1a0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f1b0: 67 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54  gno, 0, rc=SQLIT
f1c0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a  E_NOMEM);.    }.
f1d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f1e0: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f1f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f200: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f210: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f220: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f230: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f240: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f250: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f260: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f270: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f280: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f290: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f2a0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f2b0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f2c0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f2d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f2e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f2f0: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f300: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f310: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f320: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f330: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f340: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f350: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f360: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f370: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f380: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f390: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f3a0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f3b0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f3c0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f3d0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f3e0: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f3f0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f400: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f410: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f420: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f430: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f440: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f450: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f460: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f470: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f480: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f490: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f4a0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f4b0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f4c0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f4d0: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f4e0: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f4f0: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f500: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f510: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f520: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f530: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f540: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f550: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f570: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f580: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f590: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f5a0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f5b0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f5c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f5e0: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f5f0: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f600: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f610: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f620: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f630: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f640: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f650: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f660: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f670: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f680: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f690: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f6b0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f6c0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f6d0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f6e0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f6f0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f700: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f710: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f720: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f730: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f740: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f750: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f760: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f770: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f780: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f790: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f7a0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f7b0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f7c0: 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
f7d0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
f7e0: 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
f7f0: 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
f800: 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
f810: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
f820: 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
f830: 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
f840: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
f850: 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
f860: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
f870: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
f880: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
f890: 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
f8a0: 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
f8b0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
f8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f8d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
f8e0: 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
f8f0: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
f900: 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
f910: 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
f920: 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
f930: 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
f940: 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  o the..      **.
f950: 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
f960: 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
f970: 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
f980: 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
f990: 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
f9a0: 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
f9b0: 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
f9c0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
f9d0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
f9e0: 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
f9f0: 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
fa00: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
fa10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
fa20: 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
fa30: 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
fa40: 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
fa50: 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
fa60: 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
fa70: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
fa80: 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
fa90: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
faa0: 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
fab0: 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
fac0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
fad0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
fae0: 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
faf0: 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
fb00: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
fb10: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
fb20: 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
fb30: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
fb40: 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
fb50: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
fb70: 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
fb80: 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
fb90: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
fba0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
fbb0: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
fbc0: 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
fbd0: 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
fbe0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
fbf0: 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
fc00: 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
fc10: 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
fc20: 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
fc30: 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
fc40: 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
fc50: 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
fc60: 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
fc70: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
fc80: 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
fc90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fca0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
fcb0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
fcc0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
fcd0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
fce0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
fcf0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
fd00: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
fd10: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
fd20: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
fd30: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
fd40: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
fd50: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
fd60: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
fd70: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
fd80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
fd90: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
fda0: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
fdb0: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
fdc0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
fdd0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
fde0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
fdf0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
fe00: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
fe10: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
fe20: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
fe30: 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
fe40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fe50: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
fe60: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
fe70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
fe90: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
fea0: 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
feb0: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _TEST)./*.** Thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
fed0: 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d  ahead into the m
fee0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
fef0: 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a   and determines.
ff00: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
ff10: 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  t the next recor
ff20: 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74 68  d (the record th
ff30: 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c  at begins at fil
ff40: 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67  e.** offset pPag
ff50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
ff60: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
ff70: 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e   page record con
ff80: 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20  sisting.** of a 
ff90: 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
ffa0: 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69  r, pPage->pageSi
ffb0: 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ze bytes of cont
ffc0: 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  ent, followed.**
ffd0: 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65 63   by a valid chec
ffe0: 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ksum..**.** The 
fff0: 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64  pager never need
10000 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69  s to know this i
10010 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74  n order to do it
10020 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a  s job.   This.**
10030 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
10040 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68 69   used from withi
10050 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
10060 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
10090 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65  PageIsValid(Page
100a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
100b0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
100c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
100d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
100e0 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  e */.  u32 cksum
100f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10100 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  he page checksum
10110 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10130 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72  turn code from r
10140 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ead operations *
10150 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10160 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20   *fd;    /* The 
10170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10180 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72  from which we ar
10190 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75  e reading */.  u
101a0 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
101b0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
101c0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  f the page */.. 
101d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
101e0 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20  e number header 
101f0 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72  */.  fd = pPager
10200 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  ->jfd;.  rc = re
10210 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
10220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
10230 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
10240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
10250 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10280 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
10290 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
102a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
102b0 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20  ager) ){ return 
102c0 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e  0; }         /*N
102d0 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
102e0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
102f0 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75  ->dbSize ){ retu
10300 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10320 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
10330 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ead the checksum
10340 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
10350 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72  2bits(fd, pPager
10360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61  ->journalOff+pPa
10370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
10380 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
10390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
103a0 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103d0 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
103e0 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e  Read the data an
103f0 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65  d verify the che
10400 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61  cksum */.  aData
10410 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
10420 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
10430 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10440 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
10450 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
10460 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10470 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
10480 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10490 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
104c0 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f  T*/.  if( pager_
104d0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
104e0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72  ata)!=cksum ){ r
104f0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10500 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10510 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20  T*/..  /* Reach 
10520 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20  this point only 
10530 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76  if the page is v
10540 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alid */.  return
10550 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
10560 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
10570 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
10580 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
10590 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  ) */../*.** Para
105a0 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
105b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
105c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105d0 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
105e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
105f0 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
10600 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10610 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
10620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
10630 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10640 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
10650 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
10660 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10670 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
10680 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
10690 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
106a0 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
106b0 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
106c0 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
106d0 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
106e0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
106f0 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
10700 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10710 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
10720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10730 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
10740 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
10750 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
10760 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10770 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
10780 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
10790 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
107a0 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
107b0 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
107c0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
107d0 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
107e0 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
107f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
10800 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
10810 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10820 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
10830 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
10840 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
10850 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
10860 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
10870 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10880 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10890 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
108a0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
108b0 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
108c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
108d0 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
108e0 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
108f0 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10900 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10910 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
10920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
10930 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
10940 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
10950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10960 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
10970 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10980 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
109a0 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
109b0 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
109c0 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
109d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
109e0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
109f0 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10a00 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10a10 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
10a20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
10a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
10a40 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
10a50 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
10a60 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
10a70 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10a80 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10a90 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10aa0 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10ab0 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10ac0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10ad0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10ae0 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10af0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10b00 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10b10 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
10b20 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
10b30 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
10b40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
10b50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10b60 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
10b70 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10b80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10b90 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10ba0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10bb0 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10bc0 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10bd0 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10be0 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10c00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10c10 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
10c20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
10c30 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
10c40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
10c50 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
10c60 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10c70 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10c80 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10c90 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10ca0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10cb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10cc0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10cd0 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10ce0 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10cf0 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10d00 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10d10 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
10d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d30 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
10d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10d60 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
10d70 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10d80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10d90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10db0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10dc0 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10dd0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10de0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10e10 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
10e20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10e40 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
10e50 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
10e60 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
10e70 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10e80 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10e90 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10ea0 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10eb0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10ec0 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10ed0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10ee0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10ef0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10f00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10f10 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
10f20 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
10f30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10f40 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
10f50 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
10f60 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f70 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10f80 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10f90 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10fa0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10fb0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10fc0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10fd0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10fe0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11000 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
11010 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
11020 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11030 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11040 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
11050 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
11060 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
11070 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
11080 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
11090 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
110a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
110b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
110c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
110d0 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
110e0 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
110f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11100 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11110 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
11120 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
11130 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
11140 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
11150 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
11160 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11170 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
11180 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
11190 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
111a0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
111b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
111c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
111d0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
111e0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
111f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
11200 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
11210 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
11220 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
11230 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
11240 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
11250 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
11260 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
11270 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11290 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
112a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
112c0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
112d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
112e0 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
112f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11300 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
11310 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
11320 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
11350 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
11360 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
11370 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
11380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
11390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
113a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
113b0 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
113c0 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
113d0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
113e0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
113f0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11400 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
11410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11430 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
11440 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
11450 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
11460 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
11470 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
11480 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
11490 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
114a0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
114b0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
114c0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
114d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
114e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
11500 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
11510 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
11520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11540 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
11550 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
11560 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11570 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
11580 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
11590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
115a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
115b0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
115c0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
115d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11600 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11610 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
11620 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11630 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
11640 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
11650 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
11660 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11670 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
11680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
116a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
116b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
116c0 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
116d0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
116e0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
116f0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
11700 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
11710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11720 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
11730 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11750 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
11760 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11770 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
11790 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
117a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
117b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
117c0 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
117d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
117e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
117f0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
11800 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
11810 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
11820 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
11830 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
11840 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
11850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11860 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
11870 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11880 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
11890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
118a0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
118b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
118d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
118e0 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
118f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11900 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
11910 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
11920 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
11930 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
11940 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
11950 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
11960 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
11970 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
11980 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
11990 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
119a0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
119b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
119c0 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78  t open, or an ex
119d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
119e0 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69  not.** held, thi
119f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11a00 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
11a10 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  , the size of th
11a20 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61  e file is.** cha
11a30 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
11a40 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
11a50 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
11a60 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  s). If the file.
11a70 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  ** on disk is cu
11a80 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
11a90 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
11aa0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
11ab0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
11ac0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
11ad0 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
11ae0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
11af0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
11b00 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
11b10 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
11b20 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
11b30 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
11b40 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
11b50 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
11b60 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
11b70 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
11b80 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
11b90 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
11ba0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
11bb0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
11bc0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
11bd0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
11be0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
11bf0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
11c00 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
11c10 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
11c20 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c40 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
11c50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
11c60 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
11c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
11c80 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11c90 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11ca0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
11cb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
11cc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11cd0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11cf0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
11d00 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
11d10 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65  CLUSIVE && isOpe
11d20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
11d30 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
11d40 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
11d50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
11d60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
11d70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
11d80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
11d90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11da0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
11db0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
11dc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
11dd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
11de0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11e00 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
11e10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11e20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
11e30 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
11e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11e50 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
11e60 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
11e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
11ea0 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
11eb0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
11ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
11ef0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11f20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
11f30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
11f40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11f50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
11f60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
11f70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
11f80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11f90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
11fa0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
11fb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
11fc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
11fd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
11fe0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
11ff0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
12000 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
12010 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
12020 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
12030 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
12040 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
12050 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
12060 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
12070 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
12080 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
12090 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
120a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
120b0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
120c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
120d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
120e0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
120f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12100 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
12110 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
12120 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69  nded up to 512 i
12130 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
12140 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75  than 512, or rou
12150 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
12160 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
12170 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
12180 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
12190 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
121a0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
121b0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
121c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
121d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
121e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
121f0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
12200 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12210 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
12220 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
12230 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
12240 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
12250 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
12260 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
12270 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
12280 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
12290 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
122a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
122b0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
122c0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
122d0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
122e0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
122f0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
12300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
12310 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
12330 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
12340 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
12350 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
12360 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
12370 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
12380 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
12390 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
123a0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
123b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
123c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
123d0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
123e0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
123f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12400 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
12410 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
12420 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
12430 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
12440 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
12450 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
12460 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
12470 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
12480 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
12490 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
124a0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
124b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
124c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
124d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
124e0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
124f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
12500 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
12510 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
12520 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
12530 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
12540 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
12550 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
12560 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
12570 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
12580 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12590 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
125a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
125b0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
125c0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
125d0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
125e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
125f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12600 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
12610 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
12620 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
12630 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
12640 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
12650 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12660 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
12670 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
12680 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
12690 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
126a0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
126b0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
126c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
126d0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
126e0 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20   case..**  (7)  
126f0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
12700 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
12710 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
12740 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
12750 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
12760 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
12770 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
12780 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
12790 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (8)  N bytes of
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
127c0 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
127d0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
127e0 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
127f0 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
12800 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
12810 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
12820 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
12830 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
12840 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
12850 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
12860 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
12870 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
12880 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
12890 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
128a0 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (9)  Zero or m
128b0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
128c0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
128d0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
128e0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
128f0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
12900 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
12910 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
12920 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
12930 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
12940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
12950 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
12960 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
12970 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20  ean the first 8 
12980 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
12990 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
129a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
129b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
129c0 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  9th item..**.** 
129d0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
129e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
129f0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
12a00 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
12a10 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
12a20 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
12a30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
12a40 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
12a50 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
12a60 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
12a70 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12a80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12a90 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
12aa0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
12ab0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
12ac0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
12ad0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
12ae0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
12af0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
12b00 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12b10 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
12b20 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
12b30 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
12b40 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
12b50 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
12b60 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
12b70 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
12b80 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
12b90 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12ba0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
12bb0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
12bc0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
12bd0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
12be0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
12bf0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
12c00 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
12c10 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
12c20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
12c30 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
12c40 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
12c50 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
12c60 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
12c70 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
12c80 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
12c90 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
12ca0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
12cb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
12cc0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12cd0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
12ce0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
12cf0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
12d00 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
12d10 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
12d20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
12d30 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
12d40 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
12d50 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
12d60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
12d70 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12d90 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
12da0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
12db0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
12dc0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
12dd0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
12de0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
12df0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
12e00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
12e10 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
12e20 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
12e30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
12e40 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
12e50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
12e60 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
12e70 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
12e80 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
12e90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12ea0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
12eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
12ec0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
12ed0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
12ee0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12f00 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
12f10 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
12f20 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
12f30 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
12f40 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
12f50 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
12f60 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
12f70 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
12f80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
12f90 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
12fa0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
12fb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
12fc0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
12fd0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
12fe0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
12ff0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
13000 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
13010 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
13020 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
13030 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
13040 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
13050 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
13060 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
13070 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13080 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
13090 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
130a0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
130b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
130c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
130d0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
130e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
130f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13100 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
13110 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
13120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13130 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
13140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
13150 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
13170 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
13180 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
13190 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
131a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
131b0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
131c0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
131d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
131e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
131f0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
13200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
13210 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
13220 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13230 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
13240 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
13250 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13260 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13270 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
13280 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
13290 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
132a0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
132b0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
132c0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
132d0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
132e0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
132f0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
13300 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
13310 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
13320 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
13330 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
13340 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13350 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13360 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
13370 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13380 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
13390 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
133a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
133b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
133c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
133d0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
133e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
133f0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
13400 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
13410 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
13420 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13430 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
13440 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
13450 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
13460 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
13470 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
13480 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
13490 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
134a0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
134b0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
134c0 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
134d0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
134e0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
134f0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
13500 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
13510 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
13520 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
13530 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
13540 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
13550 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
13560 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
13570 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13580 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
13590 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
135a0 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
135b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
135c0 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
135d0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
135e0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
135f0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
13600 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
13610 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
13620 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
13630 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
13640 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
13650 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13660 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
13670 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13680 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
13690 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
136a0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
136b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
136c0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
136d0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
136e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
136f0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
13700 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
13710 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
13720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13730 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
13740 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
13750 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
13760 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
13770 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
13780 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
13790 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
137a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
137b0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
137c0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
137d0 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
137e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
137f0 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( 1 ){.    int i
13800 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  sUnsync = 0;..  
13810 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
13820 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
13830 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
13840 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
13850 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
13860 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
13870 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
13880 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
13890 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
138a0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
138b0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
138c0 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
138d0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
138e0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
138f0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
13900 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
13910 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
13920 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
13930 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
13940 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
13950 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
13960 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
13970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13980 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
13990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
139a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
139b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
139c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
139d0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
139e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
139f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
13a00 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
13a10 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
13a20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
13a30 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
13a40 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
13a50 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
13a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
13a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
13a80 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
13a90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
13aa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
13ab0 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
13ac0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
13ad0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
13ae0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
13af0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
13b00 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
13b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b30 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
13b40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
13b50 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
13b60 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
13b70 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
13b80 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13b90 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
13ba0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
13bb0 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
13bc0 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
13bd0 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
13be0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
13bf0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
13c00 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
13c10 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
13c20 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
13c30 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
13c40 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
13c50 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
13c60 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
13c70 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
13c80 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
13c90 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
13ca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13cb0 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
13cc0 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
13cd0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
13ce0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
13cf0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
13d00 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
13d10 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
13d20 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
13d30 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
13d40 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
13d50 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
13d60 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13d70 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
13d80 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
13d90 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
13da0 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
13db0 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
13dc0 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
13dd0 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
13de0 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
13df0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
13e00 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
13e10 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
13e20 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
13e30 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
13e40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
13e50 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
13e60 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
13e70 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
13e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13e90 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
13ea0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
13eb0 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
13ec0 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
13ed0 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
13ee0 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
13ef0 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13f20 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
13f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
13f40 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
13f50 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
13f60 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
13f70 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
13f80 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
13f90 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
13fa0 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
13fb0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
13fc0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
13fd0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
13ff0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14000 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14020 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14030 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14050 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14060 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73 55  ger));.      isU
14070 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  nsync = 1;.    }
14080 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
14090 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
140a0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
140c0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
140d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
140e0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
140f0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
14100 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14110 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
14120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14130 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
14140 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
14150 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
14160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14180 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14190 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
141a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
141b0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
141c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
141d0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
141e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
141f0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
14200 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
14210 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
14220 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
14230 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
14240 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
14250 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
14260 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
14270 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14280 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
14290 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
142a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
142b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
142c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
142d0 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26 70  er,1,isUnsync,&p
142e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
142f0 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  f,0,0);.      if
14300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14310 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14320 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14350 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14360 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
143a0 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
143b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
143c0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
143d0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
143e0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
143f0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
14400 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14410 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
14420 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
14430 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
14440 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
14450 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
14460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
14470 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
14480 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
14490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
144a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
144b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
144c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
144d0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
144e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144f0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
14500 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
14510 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
14520 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
14530 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
14540 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14550 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
14560 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
14570 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
14580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
145a0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
145b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
145c0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
145d0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
145e0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
145f0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
14600 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
14610 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
14620 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
14630 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
14640 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
14650 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
14660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14670 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
14680 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
14690 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
146a0 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
146b0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
146c0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
146d0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
146e0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
146f0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
14700 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
14710 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
14720 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
14730 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
14740 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
14750 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
14760 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
14770 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
14780 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
14790 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
147a0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
147b0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
147c0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
147d0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
147e0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
147f0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
14800 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
14810 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
14820 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
14830 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
14840 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
14850 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
14860 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
14870 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
14880 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
14890 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
148a0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
148b0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
148c0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
148d0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
148e0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
148f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
14900 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
14910 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
14920 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14940 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
14950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14960 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
14970 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
14980 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
14990 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
149a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
149b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
149c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
149d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
149e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
149f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14a00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
14a10 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
14a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a50 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14a60 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
14a70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
14a80 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
14a90 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
14aa0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14ab0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
14ac0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
14ad0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
14ae0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14af0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
14b00 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
14b10 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
14b20 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
14b30 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14b40 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
14b50 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
14b60 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
14b70 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
14b80 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
14b90 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
14ba0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
14bb0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
14bc0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
14bd0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
14be0 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
14bf0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
14c00 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
14c10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
14c20 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c40 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
14c50 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
14c60 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
14c70 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
14c80 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
14c90 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
14ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14cb0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
14cc0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
14cd0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
14ce0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
14cf0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
14d00 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
14d10 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14d20 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
14d30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
14d40 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
14d50 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
14d60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
14d70 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
14d80 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
14d90 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
14da0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
14db0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
14dc0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
14dd0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
14de0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
14df0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
14e00 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14e10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
14e20 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
14e30 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
14e40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
14e50 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
14e60 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
14e70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14e80 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
14e90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14ea0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
14eb0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
14ec0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ed0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
14ee0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
14ef0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14f00 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
14f10 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14f20 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
14f30 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
14f40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
14f50 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
14f70 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14f80 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
14f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14fa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14fb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
14fc0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
14fd0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fe0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
14ff0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
15000 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
15010 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
15020 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
15030 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
15040 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
15050 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
15060 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
15070 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
15080 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
15090 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
150a0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
150b0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
150c0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
150d0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
150e0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
150f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
15100 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
15110 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
15120 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
15130 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
15140 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
15150 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
15160 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
15170 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
15180 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
15190 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
151a0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
151b0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
151c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
151d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
151e0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
151f0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
15200 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
15210 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
15220 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
15230 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
15240 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
15250 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
15260 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
15270 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15280 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
15290 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
152a0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
152b0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
152c0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
152d0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
152e0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
152f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
15300 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
15310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15320 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
15330 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
15340 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
15350 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
15360 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
15390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
153a0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
153b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
153c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
153d0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
153e0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
153f0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15410 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15420 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15430 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
15440 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
15450 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
15460 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
15470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
15480 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15490 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
154a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
154b0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
154c0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
154d0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
154e0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
154f0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
15500 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15510 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
15520 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
15530 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
15540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
15560 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15570 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
15580 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
15590 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
155a0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
155b0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
155c0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
155d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
155e0 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
155f0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
15600 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
15610 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  OrigSize;..  /* 
15620 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
15630 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
15640 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
15650 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15660 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15670 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
15680 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
15690 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
156a0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
156b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
156c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
156d0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
156e0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
156f0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
15700 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
15710 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
15720 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
15730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
15740 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
15750 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15760 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15770 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
15780 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
15790 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
157a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
157b0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
157c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
157d0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
157e0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
157f0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
15800 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
15810 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
15820 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15830 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
15840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
15850 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
15860 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
15870 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
15880 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
15890 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
158a0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
158b0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
158c0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
158d0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
158e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
158f0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
15900 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
15910 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
15920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
15930 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
15940 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
15950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15970 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
15980 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15990 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
159a0 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
159b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
159c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
159d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
159e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
159f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
15a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15a10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15a20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
15a30 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
15a40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15a50 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
15a60 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
15a70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15a80 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
15a90 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
15aa0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
15ab0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15ac0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
15ad0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
15ae0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15af0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
15b00 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
15b10 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
15b20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
15b30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15b40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15b50 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
15b60 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15b70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15b80 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
15b90 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
15ba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
15bb0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
15bc0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
15bd0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
15be0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
15bf0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
15c00 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
15c10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
15c20 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
15c30 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
15c40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15c50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15c60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15c70 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
15c80 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
15c90 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
15ca0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
15cb0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
15cc0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
15cd0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
15ce0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15cf0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
15d00 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
15d10 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
15d20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15d30 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15d40 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
15d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15d60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
15d70 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15d80 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
15d90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15da0 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
15db0 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
15dc0 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
15dd0 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
15de0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
15df0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
15e00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15e10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15e20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15e30 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
15e40 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
15e50 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
15e60 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
15e70 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15e90 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15ea0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
15eb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15ec0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
15ed0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15ee0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15ef0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15f00 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15f10 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15f30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15f40 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
15f50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15f60 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
15f70 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
15f80 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
15f90 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
15fa0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15fb0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
15fc0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
15fd0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
15fe0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
15ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
16000 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
16010 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
16020 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
16030 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
16040 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
16050 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
16060 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
16070 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16090 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
160a0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
160b0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
160c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
160d0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
160e0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
160f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
16100 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
16110 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
16120 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
16130 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
16140 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
16150 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
16160 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
16170 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66  ager, 0, 0, &off
16180 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
16190 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
161a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
161b0 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
161c0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
161d0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
161e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
161f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16200 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16230 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
16240 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
16250 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
16260 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16280 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
16290 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
162a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
162b0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
162c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
162d0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
162e0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
162f0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
16300 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
16310 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16320 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
16330 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
16340 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
16350 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
16360 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
16370 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16380 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
16390 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
163a0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
163b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
163c0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
163d0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
163e0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
163f0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
16400 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
16410 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
16420 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
16430 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16440 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
16450 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
16460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
16480 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
16490 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
164a0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
164b0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
164c0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
164d0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
164e0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
164f0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
16500 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
16510 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16520 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
16530 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
16540 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
16550 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
16560 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
16570 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
16580 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
16590 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
165a0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
165b0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
165c0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
165d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
165e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
165f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16600 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
16610 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16620 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
16630 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
16640 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
16650 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
16660 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
16670 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
16690 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
166a0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
166b0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
166c0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
166d0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
166e0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
166f0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
16700 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
16710 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
16720 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
16730 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
16740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16750 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
16760 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
16770 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
16780 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
16790 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
167a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
167b0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
167c0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
167d0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
167e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
167f0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16800 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
16810 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
16820 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
16830 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
16840 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
16850 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
16860 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
16870 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
16880 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
16890 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
168a0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
168b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
168c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
168d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
168e0 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
168f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
16900 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
16910 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
16920 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
16930 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
16940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
16950 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
16960 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
16970 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
16980 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
16990 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
169a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
169b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
169c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
169d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
169e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
169f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16a00 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
16a10 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16a20 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16a30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
16a40 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
16a50 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16a60 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
16a70 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
16a80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
16a90 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
16aa0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
16ab0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
16ac0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
16ad0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
16ae0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
16af0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
16b00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
16b10 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
16b20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
16b30 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
16b40 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
16b50 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
16b60 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
16b70 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
16b80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
16b90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16ba0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
16bb0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
16bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16bd0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
16be0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
16bf0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
16c00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
16c10 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
16c20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16c30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
16c40 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
16c50 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
16c60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
16c70 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
16c80 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
16c90 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
16ca0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
16cb0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
16cc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ce0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16d00 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
16d10 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
16d20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
16d30 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16d40 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
16d50 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
16d60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16d70 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
16d80 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
16d90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16da0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
16db0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
16dc0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
16de0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
16df0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
16e00 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
16e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
16e30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
16e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16e50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
16e60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
16e70 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
16e80 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16e90 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
16ea0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
16eb0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
16ec0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16ed0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
16ee0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
16ef0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
16f20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
16f30 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
16f40 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
16f50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16f60 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
16f70 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
16f80 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
16f90 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
16fa0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
16fb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
16fc0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
16fd0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
16fe0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
16ff0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
17000 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
17020 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
17030 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
17080 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
17090 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
170a0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
170b0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
170c0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
170d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
170f0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
17100 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
17110 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17120 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
17130 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
17140 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
17150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
17160 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
17170 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
17180 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
17190 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
171a0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
171b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
171c0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
171d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
171e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
171f0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
17200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
17230 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
17240 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
17250 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
17260 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
17270 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
17280 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
17290 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
172b0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
172c0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
172d0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
172e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
172f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
17300 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
17310 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
17320 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
17330 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
17340 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
17350 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
17360 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
17370 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
17380 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
17390 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
173a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
173b0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
173c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
173d0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
173e0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
173f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
17400 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
17410 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
17420 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
17450 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
17460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
17480 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
17490 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
174a0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
174b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
174c0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
174d0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
174e0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
174f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17500 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
17510 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
17520 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17530 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
17540 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17560 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
17570 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
17580 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17590 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
175a0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
175b0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
175c0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
175d0 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46  RUPT or SQLITE_F
175e0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
175f0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
17600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17610 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
17620 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
17630 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
17640 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
17650 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
17660 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
17670 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
17680 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17690 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
176a0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
176b0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
176c0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
176d0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
176e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
176f0 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
17700 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17710 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
17720 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
17730 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
17740 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
17750 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
17760 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
17770 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
17780 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
17790 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
177a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
177b0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
177c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
177d0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
177e0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
177f0 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
17800 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
17810 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
17820 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
17830 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
17840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
17860 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
17870 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
17880 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
17890 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
178a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
178b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
178c0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
178d0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
178e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
178f0 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
17900 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
17910 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
17920 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
17930 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
17940 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
17950 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
17960 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
17970 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17980 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
17990 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
179a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
179b0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
179c0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
179d0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
179e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
179f0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
17a00 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
17a10 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a50 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
17a60 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
17a70 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
17a80 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
17a90 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
17aa0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
17ab0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17ac0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  ) );.    if( pag
17ad0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
17ae0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
17af0 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ize .     && (pP
17b00 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
17b10 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17b20 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
17b30 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
17b40 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17b50 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
17b60 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
17b70 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17b80 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
17b90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
17ba0 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
17bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17bc0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
17bd0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
17be0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17bf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
17c00 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
17c10 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
17c20 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
17c30 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
17c40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17c50 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
17c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17c70 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
17c80 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
17c90 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
17ca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17cb0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
17cc0 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
17cd0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ize;.    if( nRe
17ce0 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
17cf0 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
17d00 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
17d10 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
17d20 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
17d30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
17d40 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
17d50 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
17d60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
17d70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
17d80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17d90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
17da0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
17db0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
17dc0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
17dd0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
17de0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
17df0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
17e00 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
17e10 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
17e20 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
17e30 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
17e40 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
17e50 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
17e60 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
17e70 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
17e80 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
17e90 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
17ea0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
17eb0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
17ec0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
17ed0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
17ee0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
17ef0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
17f00 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
17f10 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
17f20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
17f30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
17f50 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
17f60 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
17f70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
17f80 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
17f90 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
17fa0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
17fb0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
17fc0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
17fd0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
17fe0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
17ff0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
18000 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
18010 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
18020 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
18030 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
18040 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
18050 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
18060 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
18070 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
18080 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
18090 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
180a0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
180b0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
180c0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
180d0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
180e0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
180f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
18100 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
18110 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
18120 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
18130 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
18140 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
18150 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
18160 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
18170 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
18180 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
18190 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
181a0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
181b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
181c0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
181d0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
181e0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
181f0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
18200 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
18210 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
18220 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
18230 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
18240 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
18250 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
18260 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
18270 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
18280 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
18290 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
182a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
182b0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
182c0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
182d0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
182e0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
182f0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
18300 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
18310 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
18320 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
18330 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
18340 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
18350 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
18360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
18370 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18380 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
18390 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
183a0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
183b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
183c0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
183d0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
183e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
183f0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
18400 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
18410 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
18420 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
18430 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
18440 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
18450 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
18460 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
18470 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
18480 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
18490 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
184a0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
184b0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
184c0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
184d0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
184e0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
184f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18500 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
18510 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
18520 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
18530 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
18540 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
18550 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
18560 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
18570 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
18580 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
18590 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
185a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
185b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
185c0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
185d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
185e0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
185f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18600 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
18610 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
18620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18630 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
18640 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18650 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
18660 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
18670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18680 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
18690 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
186a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
186b0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
186c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
186d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
186e0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
186f0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
18700 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
18710 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
18720 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18730 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
18740 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
18750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
18760 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
18770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18780 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
18790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
187a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
187b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
187c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
187d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
187e0 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
187f0 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  pPager. Normally
18800 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c  , this is calcul
18810 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c  ated as (<db fil
18820 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69  e size>/<page-si
18830 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ze>)..** However
18840 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
18850 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
18860 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
18870 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
18880 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
18890 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
188a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
188b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
188c0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
188d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
188e0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
188f0 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20  .** error state 
18900 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18910 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
18920 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  ge left unchange
18930 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  d. Or,.** if the
18940 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73   file system has
18950 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66   to be queried f
18960 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
18970 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  he file and.** t
18980 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74  he query attempt
18990 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65   returns an IO e
189a0 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72  rror, the IO err
189b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
189c0 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
189d0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
189e0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  nged..**.** Othe
189f0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
18a00 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
18a10 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ul, then SQLITE_
18a20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
18a30 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
18a40 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
18a50 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18a60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
18a70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18a80 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
18a90 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
18aa0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
18ab0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
18ac0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
18ad0 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
18ae0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e */..  /* If th
18af0 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
18b00 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
18b10 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74 68  state, return th
18b20 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
18b30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
18b40 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
18b50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18b60 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
18b70 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  Determine the nu
18b80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18b90 20 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65   the file. Store
18ba0 20 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20   this in nPage. 
18bb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18bc0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
18bd0 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
18be0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65  er->dbSize;.  }e
18bf0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e   /* Error return
18c20 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65  ed by OsFileSize
18c30 28 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20  () */.    i64 n 
18c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18c50 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69    /* File size i
18c60 6e 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64  n bytes returned
18c70 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29   by OsFileSize()
18c80 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
18c90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
18ca0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
18cb0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
18cc0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18cd0 2d 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28  ->fd) && (0 != (
18ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
18cf0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
18d00 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20  d, &n))) ){.    
18d10 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
18d20 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
18d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18d40 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
18d50 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
18d60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  ize ){.      nPa
18d70 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ge = 1;.    }els
18d80 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
18d90 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
18da0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18dc0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18dd0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
18de0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
18df0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
18e00 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18e10 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
18e20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
18e30 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d  Valid = 1;.    }
18e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
18e50 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
18e60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18e70 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
18e80 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
18e90 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
18ea0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
18eb0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
18ec0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
18ed0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
18ee0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
18ef0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
18f00 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
18f10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
18f20 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
18f30 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ge;.  }..  /* Se
18f40 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
18f50 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  iable and return
18f60 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20   SQLITE_OK */.  
18f70 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20  if( pnPage ){.  
18f80 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
18f90 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
18fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
18fb0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
18fc0 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
18fd0 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
18fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18ff0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
19000 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
19010 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
19020 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19030 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
19040 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
19050 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
19060 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
19070 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
19080 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
19090 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
190a0 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
190b0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
190c0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
190d0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
190e0 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
190f0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
19100 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
19110 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
19120 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
19130 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
19140 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
19150 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
19160 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
19170 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
19180 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
19190 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
191a0 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
191b0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
191c0 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
191d0 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
191e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
191f0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
19200 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
19210 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
19220 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
19230 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
19240 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
19250 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19280 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  /..  /* The OS l
19290 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
192a0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
192b0 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
192c0 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
192d0 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
192e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
192f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
19300 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
19310 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
19320 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
19330 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
19340 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
19350 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
19360 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
19370 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
19380 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
19390 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
193a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
193b0 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
193c0 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
193d0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
193e0 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
193f0 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
19400 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
19410 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
19420 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72  already held, or
19430 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
19440 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68  sistions that th
19450 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
19460 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
19470 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
19480 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
19490 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
194a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
194b0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
194c0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
194d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
194e0 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
194f0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
19500 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
19510 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
19520 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
19530 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  | (pPager->state
19540 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
19550 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
19560 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
19570 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
19580 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
19590 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
195a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
195b0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
195c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
195d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
195e0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
195f0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
19600 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
19610 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
19620 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
19630 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20  dlerArg) );.    
19640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19650 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
19660 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c  r->state = (u8)l
19670 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
19680 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
19690 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
196a0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
196b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
196c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
196d0 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
196e0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
196f0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
19700 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
19710 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
19720 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
19730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19740 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
19750 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
19760 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19770 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
19780 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
19790 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
197a0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
197b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
197c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
197d0 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
197e0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
197f0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
19800 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
19810 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
19820 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
19830 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19840 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19850 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
19860 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19870 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19880 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
19890 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a  Size = nPage;.}.
198a0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
198b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
198c0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
198d0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
198e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
198f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
19900 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
19910 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
19920 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
19930 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19940 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
19950 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
19960 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
19970 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
19980 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
19990 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
199a0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
199b0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
199c0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
199d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
199e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
199f0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
19a00 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
19a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
19a20 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
19a30 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
19a40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
19a50 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
19a60 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
19a70 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
19a80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
19a90 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
19aa0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
19ab0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
19ac0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
19ad0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
19ae0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
19af0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
19b00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
19b10 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
19b20 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  r){.  disable_si
19b30 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19b40 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
19b50 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
19b60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
19b70 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
19b80 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
19b90 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
19ba0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19bb0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19bc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
19bd0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
19be0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
19bf0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
19c00 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
19c10 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
19c20 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
19c30 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
19c40 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
19c50 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
19c60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
19c70 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
19c80 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
19c90 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
19ca0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
19cb0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
19cc0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
19cd0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
19ce0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
19cf0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
19d00 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
19d10 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
19d20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
19d30 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
19d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
19d50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
19d60 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e   -1;.    pagerUn
19d70 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
19d80 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
19d90 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
19da0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
19db0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
19dc0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
19dd0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
19de0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19df0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
19e00 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
19e10 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
19e20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
19e30 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
19e40 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
19e50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
19e60 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
19e70 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
19e80 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
19e90 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
19eb0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
19ec0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
19ed0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
19ee0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
19ef0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
19f00 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
19f10 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
19f20 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19f30 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
19f40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
19f50 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
19f60 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
19f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19f80 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
19f90 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
19fa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19fb0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
19fc0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
19fd0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
19fe0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
19ff0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1a000 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1a010 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1a020 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a030 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1a040 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1a050 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1a060 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1a070 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1a080 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1a090 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1a0a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1a0b0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1a0c0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1a0d0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1a0e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1a0f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1a100 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1a110 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1a120 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1a130 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1a140 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1a150 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1a160 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a170 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1a180 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a190 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1a1a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1a1b0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1a1c0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1a1d0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1a1e0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1a1f0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1a200 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1a210 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1a220 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1a230 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1a240 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1a250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a260 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1a270 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1a280 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1a290 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1a2a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1a2b0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1a2c0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1a2d0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1a2e0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1a2f0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1a300 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1a310 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1a320 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1a330 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1a340 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1a350 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1a360 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1a370 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1a380 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1a390 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1a3a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1a3b0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1a3c0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1a3d0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1a3e0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1a3f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1a400 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1a410 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1a420 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1a430 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1a440 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1a450 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1a460 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1a470 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1a480 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1a490 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1a4a0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1a4b0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1a4c0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1a4d0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1a4e0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1a4f0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1a500 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a510 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1a520 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1a530 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1a540 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1a550 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a560 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1a570 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1a580 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1a590 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1a5a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a5b0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1a5c0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1a5d0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1a5e0 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1a5f0 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1a600 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1a610 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1a620 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1a630 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1a640 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1a650 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1a660 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1a670 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1a680 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1a690 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1a6a0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1a6b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a6c0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a6d0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a6e0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1a6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1a710 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1a720 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1a730 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a740 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a750 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1a760 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1a770 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1a780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a7a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1a7b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1a7c0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1a7d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a7e0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a7f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a800 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a810 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1a820 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1a830 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a840 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1a850 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1a860 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1a870 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1a880 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1a890 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1a8a0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1a8b0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1a8c0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1a8d0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1a8e0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1a8f0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a900 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1a910 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1a920 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1a930 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a940 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1a950 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1a960 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1a970 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1a980 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1a990 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1a9a0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1a9b0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1a9c0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1a9d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
1a9e0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1a9f0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1aa00 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1aa10 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1aa20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1aa30 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1aa40 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1aa50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1aa60 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1aa70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1aa80 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1aa90 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1aaa0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1aab0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1aac0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1aad0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1aae0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1aaf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ab00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ab10 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ab20 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ab30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ab40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ab50 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ab60 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1ab70 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1ab80 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1ab90 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1aba0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1abb0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1abc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1abd0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1abe0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1abf0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ac00 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ac10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ac20 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ac30 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ac40 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ac50 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ac60 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1ac70 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1ac80 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1ac90 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1aca0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1acb0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1acc0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1acd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1ace0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1acf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1ad00 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1ad10 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1ad20 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1ad30 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1ad40 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1ad50 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1ad60 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1ad70 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1ad80 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1ad90 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1ada0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1adb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1adc0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1add0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1ade0 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61  gic[8];..u8 zHea
1adf0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
1ae00 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09  nalMagic)+4];...
1ae10 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
1ae20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
1ae30 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1ae40 67 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69 74  gic));..put32bit
1ae50 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
1ae60 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1ae70 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
1ae80 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
1ae90 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
1aea0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
1aeb0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
1aec0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1aed0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
1aee0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
1aef0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1af00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1af10 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
1af20 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
1af30 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
1af40 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1af50 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
1af60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1af70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1af80 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1af90 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
1afa0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1afb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1afc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1afd0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1afe0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1aff0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b010 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1b020 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
1b030 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
1b040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
1b050 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
1b060 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
1b070 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
1b080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
1b090 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
1b0a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1b0b0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
1b0c0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
1b0d0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
1b0e0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
1b0f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
1b100 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1b110 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
1b120 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1b130 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
1b140 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
1b150 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
1b160 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
1b170 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
1b180 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
1b190 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
1b1a0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
1b1b0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
1b1c0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
1b1d0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
1b1e0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
1b1f0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
1b200 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
1b210 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
1b220 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
1b230 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b240 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
1b250 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
1b260 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1b270 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1b280 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b290 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1b2a0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1b2b0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1b2c0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1b2d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1b2e0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b2f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b300 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1b310 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1b320 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b340 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1b350 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1b360 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
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 20 20 7d 0a 20 20  rc;.        }.  
1b3a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b3b0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
1b3c0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1b3d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
1b3e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b3f0 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
1b400 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b410 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
1b420 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
1b430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1b440 72 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69 66  r..);.        if
1b450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b460 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b470 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1b480 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1b490 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1b4a0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1b4b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1b4c0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b4d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b4e0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1b4f0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1b500 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1b510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b520 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1b530 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1b540 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1b550 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1b560 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1b570 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1b580 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1b590 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1b5a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b5d0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1b5e0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1b5f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1b600 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1b610 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1b620 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1b630 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1b640 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1b650 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1b660 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1b670 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1b680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1b690 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1b6a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1b6b0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1b6c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1b6d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b6e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b6f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1b700 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1b710 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1b720 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1b730 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1b740 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1b750 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1b760 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1b770 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1b780 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1b790 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1b7a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1b7b0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1b7c0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1b7d0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1b7e0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1b7f0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1b800 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1b810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1b820 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1b830 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1b840 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1b850 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1b860 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1b870 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1b880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b890 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1b8a0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1b8b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b8c0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1b8d0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1b8e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1b8f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b900 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1b910 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1b920 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1b930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1b940 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1b950 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1b960 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1b970 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1b980 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1b990 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1b9a0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1b9b0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1b9c0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1b9d0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1b9e0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1b9f0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1ba00 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1ba10 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1ba20 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1ba30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba40 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1ba50 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1ba60 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1ba70 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1ba80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ba90 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1baa0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1bab0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1bac0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1bad0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1bae0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1baf0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1bb00 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1bb10 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1bb20 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1bb30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1bb40 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1bb50 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1bb60 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1bb70 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1bb80 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1bb90 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1bba0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1bbb0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1bbc0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1bbd0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1bbe0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1bbf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bc00 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1bc10 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1bc20 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1bc30 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1bc40 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1bc50 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1bc60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1bc70 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1bc80 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1bc90 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1bca0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1bcb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1bcc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1bcd0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1bce0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1bcf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1bd20 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1bd30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1bd60 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c  ..  if( NEVER(pL
1bd70 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ist==0) ) return
1bd80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1bd90 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1bda0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1bdb0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1bdc0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1bdd0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1bde0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1bdf0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1be00 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1be10 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1be20 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1be30 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1be40 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1be50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1be60 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1be70 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1be80 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1be90 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1bea0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1beb0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1bec0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1bed0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1bee0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1bef0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1bf00 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1bf10 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1bf20 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1bf30 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1bf40 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1bf50 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1bf60 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1bf70 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1bf80 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1bf90 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1bfa0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1bfb0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1bfc0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1bfd0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1bfe0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1bff0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1c000 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1c010 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1c020 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1c030 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1c040 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1c050 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1c060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1c070 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1c080 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1c090 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1c0a0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1c0b0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1c0c0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1c0d0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1c0e0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1c0f0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1c100 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c110 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c120 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1c130 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
1c140 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1c150 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1c160 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
1c170 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
1c180 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1c190 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1c1a0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
1c1b0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
1c1c0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
1c1d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1c1e0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
1c1f0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
1c200 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
1c210 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
1c220 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
1c230 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
1c240 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1c250 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
1c260 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1c270 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
1c280 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
1c290 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
1c2a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1c2b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
1c2c0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  lags);.  }..  wh
1c2d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1c2e0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
1c2f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
1c300 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
1c310 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1c320 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1c330 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1c340 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1c350 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1c360 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1c370 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1c380 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1c390 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
1c3a0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1c3b0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1c3c0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1c3d0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1c3e0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1c3f0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1c400 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1c410 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c420 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
1c430 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
1c440 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
1c450 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1c460 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
1c470 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
1c480 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1c490 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
1c4a0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
1c4b0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
1c4c0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
1c4d0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
1c4e0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1c4f0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c500 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c510 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
1c520 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
1c530 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
1c570 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
1c580 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
1c590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
1c5a0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c5b0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
1c5c0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
1c5d0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1c5e0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
1c5f0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
1c600 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
1c610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c620 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1c630 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1c640 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1c650 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
1c660 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
1c670 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
1c680 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
1c690 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
1c6a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
1c6b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
1c6c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1c6d0 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
1c6e0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
1c6f0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
1c700 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
1c710 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
1c720 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1c730 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1c740 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1c750 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c760 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
1c770 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1c780 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1c790 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1c7a0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
1c7b0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1c7c0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1c7d0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
1c7e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
1c7f0 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
1c800 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
1c810 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c820 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
1c830 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1c840 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1c850 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
1c860 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
1c870 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
1c880 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
1c890 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1c8a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1c8c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c8d0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1c8e0 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
1c8f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
1c900 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
1c910 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
1c920 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1c930 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1c940 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
1c950 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1c960 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
1c970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1c980 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
1c990 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
1c9a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c9b0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
1c9c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1c9d0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1c9e0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1c9f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1ca00 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1ca10 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1ca20 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
1ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca40 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
1ca50 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
1ca60 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
1ca70 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
1ca80 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
1ca90 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
1caa0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
1cab0 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
1cac0 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
1cad0 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
1cae0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
1caf0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1cb00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1cb10 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1cb20 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
1cb30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1cb40 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
1cb50 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
1cb60 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
1cb70 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
1cb80 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
1cb90 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1cba0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
1cbb0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1cbc0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
1cbd0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
1cbe0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
1cbf0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
1cc00 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
1cc10 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
1cc20 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
1cc30 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
1cc40 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
1cc50 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
1cc60 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
1cc70 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
1cc80 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1cc90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cca0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1ccb0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ccc0 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  r;.  if( isOpen(
1ccd0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
1cce0 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
1ccf0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
1cd00 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1cd10 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
1cd20 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
1cd30 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ize);.    char *
1cd40 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44  pData2;..    COD
1cd50 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1cd60 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
1cd70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1cd80 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
1cd90 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1cda0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1cdb0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1cdc0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1cdd0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20  ->pgno));.  .   
1cde0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
1cdf0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
1ce00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ce10 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
1ce20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1ce30 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
1ce40 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
1ce50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1ce60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ce80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1ce90 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
1cea0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1ceb0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
1cec0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1ced0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cee0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1cef0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
1cf00 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1cf10 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
1cf20 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
1cf30 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
1cf40 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74  Pg->pgno);.    t
1cf50 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1cf60 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1cf70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1cf80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cf90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
1cfa0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
1cfb0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
1cfc0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
1cfd0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
1cfe0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1cff0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1d000 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
1d010 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
1d020 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
1d030 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
1d040 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
1d050 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
1d060 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
1d070 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
1d080 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
1d090 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
1d0a0 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1d0b0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
1d0c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1d0d0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
1d0e0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
1d0f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
1d100 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
1d110 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
1d120 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
1d130 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
1d140 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
1d150 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
1d160 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
1d170 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
1d180 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d190 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
1d1a0 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
1d1b0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
1d1c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1d1d0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
1d1e0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
1d1f0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1d200 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
1d210 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
1d220 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d230 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d240 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
1d250 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
1d260 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
1d270 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1d280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1d290 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
1d2a0 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
1d2b0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
1d2c0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
1d2d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1d2e0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
1d2f0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
1d300 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1d310 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
1d320 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1d330 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
1d340 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
1d350 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1d360 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1d370 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
1d380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1d390 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
1d3a0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
1d3b0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
1d3c0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
1d3d0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
1d3e0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1d3f0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50   by the sqlite3P
1d400 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63  agerWrite() func
1d410 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20  tion while it.  
1d420 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e  ** is journallin
1d430 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f  g a set of two o
1d440 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20  r more database 
1d450 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 73  pages that are s
1d460 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  tored.  ** on th
1d470 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74  e same disk sect
1d480 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20  or. Syncing the 
1d490 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1d4a0 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 2a  llowed while.  *
1d4b0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1d4c0 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d 70  ing as it is imp
1d4d0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
1d4e0 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20  members of such 
1d4f0 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61  a.  ** set of pa
1d500 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20 74  ges are synced t
1d510 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e  o disk together.
1d520 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65   So, if the page
1d530 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1d540 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f   ** is trying to
1d550 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c   make clean will
1d560 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1d570 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20  al sync and the 
1d580 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66  doNotSync.  ** f
1d590 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74 75  lag is set, retu
1d5a0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1d5b0 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20 70   anything. The p
1d5c0 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c 6c  cache layer will
1d5d0 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20  .  ** just have 
1d5e0 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
1d5f0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
1d600 61 67 65 20 62 75 66 66 65 72 20 69 6e 73 74 65  age buffer inste
1d610 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69  ad of.  ** reusi
1d620 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a  ng pPg..  **.  *
1d630 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20  * Similarly, if 
1d640 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
1d650 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
1d660 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
1d670 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74  o not.  ** try t
1d680 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  o write the cont
1d690 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64  ents of pPg to d
1d6a0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
1d6b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d6c0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  || (pPager->doNo
1d6d0 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c  tSync && pPg->fl
1d6e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d6f0 59 4e 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75  YNC) ){.    retu
1d700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d710 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  }..  /* Sync the
1d720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1d730 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1d740 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1d750 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1d760 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  {.    rc = syncJ
1d770 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1d780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d790 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1d7a0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20  >fullSync && .  
1d7b0 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
1d7c0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1d7d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1d7e0 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21 28  ORY) &&.      !(
1d7f0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1d800 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1d810 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
1d820 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1d830 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  END).    ){.    
1d840 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
1d850 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
1d860 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1d870 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1d880 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
1d890 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1d8a0 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
1d8b0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1d8c0 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  nt size of.  ** 
1d8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1d8e0 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
1d8f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
1d900 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d910 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62  ..  ** This is b
1d920 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
1d930 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
1d940 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
1d950 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63  will not.  ** ac
1d960 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
1d970 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
1d980 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
1d990 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  .  ** Consider t
1d9a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
1d9b0 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
1d9c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
1d9d0 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
1d9e0 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
1d9f0 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
1da00 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20  age X>.  **     
1da10 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
1da20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
1da30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1da40 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20  o Y pages>.  ** 
1da50 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
1da60 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20 20  s(page X).  **  
1da70 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
1da80 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  p;.  **.  ** If 
1da90 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
1daa0 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
1dab0 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
1dac0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
1dad0 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68  n.  ** out to th
1dae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1daf0 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
1db00 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
1db10 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20  che. Then,.  ** 
1db20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
1db30 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
1db40 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
1db50 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
1db60 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ad.  ** data fro
1db70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1db80 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
1db90 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
1dba0 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a 20  ge X as it.  ** 
1dbb0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
1dbc0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1dbd0 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
1dbe0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
1dbf0 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78 65  sp".  ** was exe
1dc00 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuted..  **.  **
1dc10 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
1dc20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
1dc30 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
1dc40 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
1dc50 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
1dc60 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
1dc70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1dc80 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
1dc90 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  it will.  ** be 
1dca0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1dcb0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
1dcc0 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
1dcd0 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a 2a   TO sp" is .  **
1dce0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
1dcf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dd00 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
1dd10 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1dd20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
1dd30 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
1dd40 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
1dd50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  age(pPg);.  }.. 
1dd60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
1dd70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
1dd80 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
1dd90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1dda0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ddb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  _OK ){.    pPg->
1ddc0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1ddd0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1dde0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1ddf0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
1de00 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1de10 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1de20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de30 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
1de40 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
1de50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1de60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
1de70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1de80 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
1de90 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dea0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1deb0 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  er, rc);.}.../*.
1dec0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
1ded0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
1dee0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
1def0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
1df00 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
1df10 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
1df20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
1df30 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
1df40 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
1df50 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1df60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
1df70 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1df80 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
1df90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dfa0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
1dfb0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
1dfc0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
1dfd0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
1dfe0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
1dff0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
1e000 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
1e010 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
1e020 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
1e030 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
1e040 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
1e050 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
1e060 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
1e070 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
1e080 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
1e090 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
1e0a0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
1e0b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1e0c0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
1e0d0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1e0e0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
1e0f0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e100 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
1e110 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
1e120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1e130 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1e140 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
1e150 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
1e160 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
1e170 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
1e180 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
1e190 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
1e1a0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
1e1b0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
1e1c0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
1e1d0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
1e1e0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
1e1f0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
1e200 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
1e210 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
1e220 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
1e230 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
1e240 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
1e250 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
1e260 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
1e270 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a  ADLOCK flags..**
1e280 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
1e290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1e2a0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
1e2b0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
1e2c0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
1e2d0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
1e2e0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1e2f0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
1e300 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
1e310 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
1e320 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
1e330 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
1e340 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
1e350 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
1e360 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e370 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
1e380 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
1e390 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
1e3a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
1e3b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1e3c0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
1e3d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
1e3e0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
1e3f0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
1e400 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
1e410 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
1e420 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
1e430 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
1e440 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
1e450 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
1e460 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
1e470 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
1e480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1e490 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
1e4a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1e4b0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1e4c0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
1e4d0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
1e4e0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
1e4f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
1e500 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
1e510 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
1e520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1e530 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
1e540 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e550 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
1e560 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e580 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
1e590 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
1e5a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
1e5b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1e5c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
1e5d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
1e5e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1e5f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
1e600 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
1e610 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
1e620 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
1e630 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
1e640 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
1e650 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
1e660 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
1e670 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
1e680 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
1e690 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
1e6a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e6b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
1e6c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1e6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e6e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e6f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
1e700 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
1e710 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
1e720 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
1e730 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
1e740 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
1e750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e760 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e770 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1e780 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
1e790 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
1e7a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1e7b0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
1e7c0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
1e7d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
1e7e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
1e7f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
1e800 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
1e810 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
1e820 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
1e830 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
1e840 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1e850 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
1e860 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1e870 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
1e880 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
1e890 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
1e8a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
1e8b0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
1e8c0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
1e8d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1e8e0 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
1e8f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
1e900 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f  READLOCK)!=0;  /
1e910 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72  * True to omit r
1e920 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  ead-lock */.  in
1e930 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
1e940 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
1e950 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
1e960 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e970 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
1e980 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  16 szPageDflt = 
1e990 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1e9a0 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
1e9b0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
1e9c0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1e9d0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
1e9e0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
1e9f0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1ea00 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
1ea10 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
1ea20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
1ea30 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
1ea40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
1ea50 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
1ea60 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
1ea70 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
1ea80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1ea90 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
1eaa0 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
1eab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
1eac0 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
1ead0 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
1eae0 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
1eaf0 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
1eb00 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
1eb10 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
1eb20 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
1eb30 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
1eb40 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
1eb50 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
1eb60 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
1eb70 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
1eb80 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
1eb90 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
1eba0 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
1ebb0 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
1ebc0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
1ebd0 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
1ebe0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
1ebf0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
1ec00 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
1ec10 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
1ec20 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
1ec30 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
1ec40 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
1ec50 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1ec60 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
1ec70 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
1ec80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
1ec90 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
1eca0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
1ecb0 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
1ecc0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
1ecd0 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
1ece0 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
1ecf0 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
1ed00 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
1ed10 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
1ed20 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1ed30 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
1ed40 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
1ed50 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
1ed60 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
1ed70 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
1ed80 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1ed90 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
1eda0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1edb0 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
1edc0 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
1edd0 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
1ede0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
1edf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
1ee00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ee10 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  M;.    }.#ifndef
1ee20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
1ee30 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
1ee40 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
1ee50 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
1ee60 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
1ee70 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
1ee80 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
1ee90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
1eea0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
1eeb0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
1eec0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
1eed0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
1eee0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
1eef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1ef00 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
1ef10 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
1ef20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
1ef30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
1ef40 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ..    nPathname 
1ef50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1ef60 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
1ef70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef80 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
1ef90 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
1efa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
1efb0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
1efc0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
1efd0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
1efe0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1eff0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
1f000 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
1f010 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
1f020 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
1f030 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
1f040 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
1f050 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
1f060 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
1f070 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
1f080 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
1f090 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
1f0a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
1f0b0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
1f0c0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
1f0d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
1f0e0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
1f0f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f100 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
1f110 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f130 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f140 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
1f150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
1f170 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
1f180 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1f190 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
1f1a0 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
1f1b0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1f1c0 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
1f1d0 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
1f1e0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
1f1f0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
1f200 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
1f210 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1f220 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
1f230 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1f250 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
1f260 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
1f270 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1f290 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
1f2a0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1f2b0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
1f2c0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
1f2d0 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
1f2e0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
1f2f0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
1f300 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1f310 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
1f320 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
1f330 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
1f340 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1f350 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
1f360 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
1f370 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
1f380 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1f390 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
1f3a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f3b0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
1f3c0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
1f3d0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
1f3e0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
1f3f0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
1f400 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
1f410 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
1f420 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
1f430 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
1f440 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
1f450 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
1f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
1f470 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
1f480 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
1f490 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
1f4a0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
1f4b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
1f4c0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
1f4d0 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
1f4e0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
1f4f0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
1f500 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
1f510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1f520 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
1f530 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f550 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
1f560 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1f570 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1f580 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
1f590 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
1f5a0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
1f5b0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
1f5c0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1f5d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1f5e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1f5f0 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
1f600 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
1f610 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
1f620 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
1f630 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
1f640 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1f650 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
1f660 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
1f670 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f680 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
1f690 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
1f6a0 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
1f6b0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f6c0 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
1f6d0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
1f6e0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
1f6f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f700 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
1f710 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
1f720 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
1f730 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
1f740 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1f750 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1f760 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1f770 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1f780 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1f790 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
1f7a0 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
1f7b0 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
1f7c0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1f7d0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
1f7e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  {.    pPager->zJ
1f7f0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
1f800 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
1f810 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d  name + 1);.    m
1f820 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
1f830 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
1f840 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
1f850 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1f860 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
1f870 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f880 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
1f890 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f8a0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
1f8b0 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20  ournal", 8);.   
1f8c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
1f8d0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70  lename[0]==0 ) p
1f8e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
1f8f0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  0] = 0;.    sqli
1f900 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
1f910 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
1f920 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
1f930 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
1f940 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
1f950 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
1f960 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
1f970 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
1f980 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
1f990 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
1f9a0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
1f9d0 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
1f9e0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
1f9f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1fa00 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
1fa10 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
1fa20 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
1fa30 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
1fa40 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
1fa50 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
1fa60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1fa70 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
1fa80 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
1fa90 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1faa0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
1fab0 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
1fac0 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
1fad0 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
1fae0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1faf0 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
1fb00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
1fb10 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
1fb20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fb30 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
1fb40 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
1fb50 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
1fb60 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1fb70 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1fb80 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
1fb90 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
1fba0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
1fbb0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
1fbc0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
1fbd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fbe0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
1fbf0 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
1fc00 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1fc10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
1fc20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1fc30 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
1fc40 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fc50 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
1fc60 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
1fc70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1fc80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1fc90 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1fca0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
1fcb0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
1fcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
1fcd0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
1fce0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fcf0 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
1fd00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fd10 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31  szPageDflt = (u1
1fd20 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  6)pPager->sector
1fd30 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
1fd40 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
1fd50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1fd60 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
1fd70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
1fd80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1fd90 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fda0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1fdb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1fdc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1fdd0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1fde0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
1fdf0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1fe00 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
1fe10 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
1fe20 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1fe30 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
1fe40 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fe50 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
1fe60 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
1fe70 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
1fe80 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1fe90 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
1fea0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1feb0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
1fec0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
1fed0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1fee0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
1fef0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ff00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ff10 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1ff20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1ff30 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1ff40 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1ff50 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
1ff60 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
1ff70 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
1ff80 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
1ff90 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1ffa0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
1ffb0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
1ffc0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
1ffd0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
1ffe0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
1fff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
20000 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
20010 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
20020 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
20030 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
20040 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
20050 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
20060 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
20070 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
20080 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
20090 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
200a0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
200b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
200c0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
200d0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
200e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
200f0 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64  LUSIVE;.    read
20100 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
20110 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
20120 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
20130 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20140 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
20150 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
20160 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
20170 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
20180 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
20190 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
201a0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
201b0 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
201c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
201d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
201e0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
201f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
20200 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
20210 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
20220 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
20230 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
20240 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
20250 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
20260 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65  or occurred in e
20270 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
20280 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
20290 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
202a0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
202b0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
202c0 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
202d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
202e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
202f0 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20  TmpSpace );.    
20300 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
20310 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
20320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
20330 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
20340 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
20350 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
20360 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
20370 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
20380 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72  <1000 );.  nExtr
20390 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
203a0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
203b0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
203c0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
203d0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
203e0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
203f0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
20400 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
20410 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20420 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
20430 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
20440 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
20450 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
20460 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
20470 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
20480 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
20490 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
204a0 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
204b0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
204c0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
204d0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
204e0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
204f0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
20500 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
20510 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
20520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20530 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
20540 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
20550 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
20560 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
20570 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
20580 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
20590 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
205a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
205b0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
205c0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
205d0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
205e0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
205f0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
20600 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
20610 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
20620 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
20630 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
20640 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
20650 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
20660 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
20670 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
20680 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
20690 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
206a0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
206b0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
206c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
206d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
206e0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
206f0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
20700 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
20710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
20720 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
20730 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
20740 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20750 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
20760 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
20770 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20780 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20790 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
207a0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
207b0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
207c0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
207d0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
207e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
207f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73   */.  assert( us
20800 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
20810 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
20820 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
20830 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
20840 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
20850 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
20860 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
20870 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
20880 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
20890 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
208a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
208b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
208c0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
208d0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
208e0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
208f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
20900 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
20910 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
20920 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
20930 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
20940 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
20950 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
20960 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
20970 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
20980 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
20990 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
209a0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
209b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
209c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
209d0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
209e0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
209f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20a00 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20a10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
20a20 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
20a30 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
20a40 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
20a50 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
20a60 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
20a70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
20a80 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
20a90 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
20aa0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
20ab0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
20ac0 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
20ad0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
20ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20af0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
20b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20b10 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
20b20 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
20b30 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
20b40 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
20b50 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
20b60 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
20b70 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
20b80 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
20b90 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
20ba0 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
20bb0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
20bc0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
20bd0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
20be0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
20bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
20c00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
20c10 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
20c20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
20c30 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
20c40 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
20c50 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
20c60 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
20c70 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
20c80 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
20c90 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
20ca0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
20cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20cc0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
20cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20ce0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
20cf0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
20d00 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
20d10 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
20d20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20d30 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
20d40 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
20d50 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
20d60 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
20d70 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
20d80 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
20d90 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
20da0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
20db0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
20dc0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
20dd0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
20de0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
20df0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
20e00 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
20e10 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
20e20 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
20e30 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
20e40 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
20e50 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
20e60 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
20e70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20e80 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
20e90 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
20ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
20eb0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
20ec0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
20ed0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
20ee0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
20ef0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
20f00 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
20f10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20f20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
20f30 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
20f40 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
20f50 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
20f60 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
20f70 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
20f80 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
20f90 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
20fa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20fb0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
20fc0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
20fd0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
20fe0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
20ff0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
21000 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
21010 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
21020 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
21030 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21040 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
21050 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
21060 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
21070 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
21080 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
21090 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
210a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
210b0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
210c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
210d0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
210e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
210f0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
21100 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
21110 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
21120 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
21130 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
21140 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
21150 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
21160 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
21170 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
21180 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
21190 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
211a0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
211d0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
211e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
211f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
21200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
21210 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61   present */..  a
21220 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
21230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73   );.  assert( us
21240 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
21250 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21260 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
21270 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
21280 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
21290 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
212a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
212b0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
212c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
212d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
212e0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
212f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21300 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
21310 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21330 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
21340 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
21350 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
21360 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
21370 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
21380 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
21390 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
213a0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
213b0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
213c0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
213d0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
213e0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
213f0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
21400 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
21410 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
21420 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
21430 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
21440 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
21450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
21460 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
21470 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
21480 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
21490 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
214a0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
214b0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
214c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
214d0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
214e0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
214f0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
21500 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
21510 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
21520 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
21530 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
21540 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
21550 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
21560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21570 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
21580 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21590 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
215a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
215b0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
215c0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
215d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
215e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
215f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
21600 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
21610 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
21620 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
21630 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
21640 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
21650 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
21660 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
21670 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
21680 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
21690 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
216a0 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
216b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
216c0 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
216d0 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
216e0 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
216f0 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
21700 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
21710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21720 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
21730 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21760 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
21770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21780 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
21790 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
217a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
217b0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
217c0 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
217d0 20 20 20 20 7c 7c 20 20 73 71 6c 69 74 65 33 4f      ||  sqlite3O
217e0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
217f0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
21800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21820 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
21830 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
21840 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
21850 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21860 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21870 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20  SHARED );.      
21880 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
21890 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
218a0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
218b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
218c0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
218d0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
218e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
218f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21900 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
21910 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
21920 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21930 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
21940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
21950 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
21960 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
21970 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
21980 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
21990 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
219a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
219b0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
219c0 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
219d0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
219e0 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
219f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
21a00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
21a10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
21a20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
21a30 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
21a40 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
21a50 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
21a60 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
21a70 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
21a80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21a90 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
21aa0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
21ab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21ac0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
21ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21ae0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
21af0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
21b00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
21b10 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
21b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
21b40 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
21b50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21b60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
21b70 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
21b80 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
21b90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
21bb0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
21bd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21c00 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
21c10 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
21c20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
21c30 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
21c40 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
21c50 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
21c60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
21c70 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
21c80 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
21c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
21ca0 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
21cc0 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
21cd0 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
21ce0 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
21cf0 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
21d00 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
21d10 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
21d20 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
21d30 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
21d40 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
21d50 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
21d60 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
21d70 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
21d80 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
21d90 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
21da0 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
21db0 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
21dc0 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
21dd0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
21de0 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
21df0 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
21e00 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
21e10 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
21e20 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
21e30 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
21e40 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
21e50 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
21e60 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
21e70 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
21e80 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
21e90 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
21ea0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21eb0 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
21ec0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
21ed0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21ee0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
21ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
21f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21f20 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
21f30 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
21f40 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
21f50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
21f60 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
21f70 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
21f80 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
21f90 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
21fa0 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
21fb0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
21fc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
21fd0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
21fe0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
21ff0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
22000 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
22010 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
22020 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
22030 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
22050 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
22060 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
22070 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
22080 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
22090 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
220a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
220b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
220c0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
220d0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
220e0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
220f0 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
22100 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
22110 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
22120 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
22130 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
22140 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
22150 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
22160 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22180 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36  urn code */.  i6
22190 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20  4 iOffset;      
221a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
221b0 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69 6c  te offset of fil
221c0 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
221d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
221e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
221f0 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
22200 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
22210 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22220 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 69 73  d) );..  if( !is
22230 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22240 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22250 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22260 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
22270 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
22280 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
222a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66  TE_OK;.  }.  iOf
222b0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
222c0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
222d0 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
222e0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
222f0 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
22300 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
22310 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Size, iOffset);.
22320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22330 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
22340 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  D ){.    rc = SQ
22350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22360 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
22370 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
22380 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
22390 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d  Data)[24];.    m
223a0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
223b0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
223c0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
223d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
223e0 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
223f0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
22400 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
22410 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
22420 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
22430 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
22440 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
22450 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
22460 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
22470 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
22480 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
22490 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
224a0 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
224b0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
224c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
224d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
224e0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
224f0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
22500 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22520 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22530 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
22540 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
22550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
22560 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
22570 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
22580 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
22590 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
225a0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
225b0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
225c0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
225d0 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
225e0 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
225f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22600 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
22610 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
22620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
22630 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
22640 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
22650 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
22660 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
22670 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
22680 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  y in PAGER_UNLOC
22690 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  K state (no lock
226a0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
226b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
226c0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
226d0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
226e0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
226f0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
22700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22710 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
22720 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
22730 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
22740 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
22750 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
22760 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
22770 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
22780 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
22790 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
227a0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
227b0 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
227c0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
227d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
227e0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
227f0 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
22800 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
22810 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
22820 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
22830 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
22840 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
22850 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
22860 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
22870 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
22880 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22890 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
228a0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
228b0 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
228c0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
228d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
228e0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
228f0 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
22900 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
22910 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
22920 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
22930 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
22940 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
22950 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
22960 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22970 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
22980 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
22990 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
229a0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
229b0 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
229c0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
229d0 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f   (2) above is no
229e0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64  t attempted, and
229f0 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72   if the.** pager
22a00 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
22a10 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
22a20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65   SQLITE_FULL whe
22a30 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
22a40 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73  ,.** the error s
22a50 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
22a60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  is returned. It 
22a70 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
22a80 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61  read the.** data
22a90 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c  base when in SQL
22aa0 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73  ITE_FULL error s
22ab0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tate..**.** Othe
22ac0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
22ad0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
22ae0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
22af0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
22b00 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63  .** IO error occ
22b10 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
22b20 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
22b30 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
22b40 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
22b50 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  le or rolling ba
22b60 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
22b70 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
22b80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22b90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22ba0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
22bb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22bc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22bd0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
22be0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22bf0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ode */.  int isE
22c00 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20  rrorReset = 0;  
22c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22c20 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e  rue if recoverin
22c30 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61  g from error sta
22c40 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  te */..  /* If t
22c50 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 73  his database has
22c60 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
22c70 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
22c80 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 0a 20 20  and is in an .  
22c90 2a 2a 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  ** error-state, 
22ca0 74 68 69 73 20 69 73 20 61 20 63 68 61 6e 63 65  this is a chance
22cb0 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
22cc0 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
22cd0 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20   .  ** contents 
22ce0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
22cf0 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 20  he and rollback 
22d00 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
22d10 69 6e 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  in the.  ** file
22d20 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  -system..  */.  
22d30 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 73 71  if( !MEMDB && sq
22d40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
22d50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22d60 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65  che)==0 && pPage
22d70 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
22d80 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
22d90 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
22da0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b  ger->zJournal ){
22db0 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65  .      isErrorRe
22dc0 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  set = 1;.    }. 
22dd0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
22de0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
22df0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
22e00 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
22e10 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
22e20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
22e30 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
22e40 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
22e50 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
22e60 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
22e70 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
22e80 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
22e90 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
22ea0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
22eb0 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
22ec0 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
22ed0 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
22ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22ef0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
22f00 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
22f10 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
22f20 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
22f30 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
22f40 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
22f50 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45  ER_UNLOCK || isE
22f60 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
22f70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
22f80 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
22f90 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
22fa0 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  t isHotJournal =
22fb0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
22fc0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
22fd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
22fe0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
22ff0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
23000 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
23010 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
23020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
23030 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
23040 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
23050 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
23060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23080 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
23090 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
230a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
230b0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
230c0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
230d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
230e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
230f0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
23100 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
23110 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
23120 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23130 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
23140 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
23150 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
23160 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
23170 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
23180 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
23190 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
231a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
231b0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
231c0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
231d0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
231e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
231f0 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
23200 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
23210 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
23220 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
23230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23250 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
23260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23270 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
23280 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
23290 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
232a0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
232b0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
232c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
232d0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
232e0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
232f0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
23300 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
23310 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
23320 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
23330 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
23340 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
23350 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
23360 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
23370 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
23380 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
23390 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
233a0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
233b0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
233c0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
233d0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
233e0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
233f0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
23400 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
23410 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
23420 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
23430 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
23440 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
23450 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
23460 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
23470 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
23480 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
23490 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
234a0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
234b0 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
234c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
234d0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
234e0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
234f0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
23500 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
23510 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23520 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23530 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
23540 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
23550 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
23560 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
23570 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
23580 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
23590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
235a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
235b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
235c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
235d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
235e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
235f0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
23600 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
23610 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
23620 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
23630 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
23640 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
23650 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
23660 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
23670 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
23680 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
23690 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
236a0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
236b0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
236c0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
236d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
236e0 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
236f0 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
23700 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
23710 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
23720 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
23730 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
23740 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
23750 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
23760 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
23770 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
23780 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
23790 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
237a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
237b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
237c0 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
237d0 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
237e0 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
237f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
23800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23810 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
23820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23830 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
23840 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
23850 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23860 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
23870 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
23880 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23890 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
238a0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
238b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
238c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
238d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
238e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
238f0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
23900 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
23910 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
23920 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23930 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
23940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23950 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
23960 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
23970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
23990 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20  TOPEN;.         
239a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
239b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
239c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
239d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
239e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
239f0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
23a00 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
23a10 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
23a20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
23a30 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
23a40 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
23a50 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
23a60 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
23a70 66 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20  fore .          
23a80 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
23a90 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
23aa0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
23ab0 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
23ad0 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
23ae0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
23af0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
23b00 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  en this.        
23b10 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
23b20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
23b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23b40 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
23b50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23b60 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
23b70 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
23b80 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
23b90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23ba0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23bc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23bd0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
23be0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79      /* TODO: Why
23bf0 20 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72   are these clear
23c00 65 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e  ed here? Is it n
23c10 65 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20  ecessary? */.   
23c20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
23c30 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
23c40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23c50 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
23c60 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
23c70 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
23c80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
23c90 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
23ca0 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
23cb0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
23cc0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
23cd0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
23ce0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
23cf0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
23d00 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
23d10 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
23d20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
23d30 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
23d40 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
23d50 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
23d60 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
23d70 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
23d80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23d90 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
23da0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
23db0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
23dc0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
23dd0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
23de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23df0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23e00 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
23e10 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
23e20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e40 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
23e50 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
23e60 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
23e70 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
23e80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
23e90 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
23ea0 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
23eb0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
23ec0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
23ed0 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
23ee0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
23ef0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
23f00 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
23f10 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
23f20 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
23f30 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
23f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
23f50 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
23f60 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
23f70 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
23f80 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
23f90 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
23fa0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
23fb0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
23fc0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
23fd0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
23fe0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
23ff0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
24000 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
24010 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
24020 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
24030 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
24040 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
24050 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
24060 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
24070 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
24080 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
24090 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
240a0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
240b0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
240c0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
240d0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
240e0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
240f0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
24100 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
24110 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
24120 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
24130 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
24140 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
24150 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
24160 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
24170 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
24180 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
24190 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
241a0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
241b0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
241c0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
241d0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
241e0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
241f0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
24200 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
24210 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
24220 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
24230 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
24240 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24250 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
24260 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24270 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20  t(pPager, 0);.. 
24280 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
24290 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
242a0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
242b0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
242c0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
242d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
242e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
242f0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
24300 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
24310 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  bSize>0 ){.     
24320 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
24330 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
24340 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
24350 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
24360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24370 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
24380 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
24390 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
243a0 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
243b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
243c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
243d0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
243e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
243f0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
24400 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
24410 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
24420 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
24430 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
24440 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
24450 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
24460 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
24470 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
24480 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
24490 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
244a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
244b0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
244c0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
244d0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
244e0 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20  SHARED );.  }.. 
244f0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
24500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24510 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
24520 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
24530 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
24540 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
24550 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
24560 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
24570 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
24580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24590 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
245a0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
245b0 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
245c0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
245d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
245e0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
245f0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
24600 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
24610 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
24620 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
24630 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
24640 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
24650 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
24660 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
24670 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
24680 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
24690 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
246a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
246b0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
246c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
246d0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
246e0 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
246f0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24700 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24710 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61  ==0).   && (!pPa
24720 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
24730 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
24740 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29  urnalOff>0) .  )
24750 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
24760 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
24770 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
24780 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
24790 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
247a0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
247b0 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
247c0 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
247d0 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
247e0 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
247f0 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
24800 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
24810 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
24820 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
24830 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
24840 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
24850 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
24860 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
24870 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
24880 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
24890 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
248a0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
248b0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
248c0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
248d0 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
248e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
248f0 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
24900 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
24910 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
24920 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
24930 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
24940 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
24950 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
24960 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
24970 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
24980 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
24990 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
249a0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
249b0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
249c0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
249d0 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
249e0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
249f0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
24a00 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
24a10 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
24a20 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
24a30 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
24a40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24a50 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
24a60 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
24a70 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
24a80 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
24a90 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
24aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
24ab0 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
24ac0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
24ad0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24ae0 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
24af0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
24b00 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
24b10 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
24b20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
24b30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
24b40 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
24b50 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
24b60 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
24b70 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
24b80 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
24b90 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
24ba0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
24bb0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
24bc0 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
24bd0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
24be0 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
24bf0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
24c00 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
24c10 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
24c20 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
24c30 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
24c40 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f  eperate scenario
24c50 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
24c60 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
24c70 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
24c80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
24c90 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
24ca0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
24cb0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
24cc0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
24cd0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
24ce0 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
24cf0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
24d00 6f 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20  o populate with 
24d10 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
24d20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
24d30 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
24d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
24d50 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
24d60 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
24d70 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
24d80 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
24d90 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
24da0 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
24db0 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
24dc0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
24dd0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
24de0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
24df0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
24e00 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
24e10 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
24e20 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
24e30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
24e40 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
24e50 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
24e60 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
24e70 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
24e80 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
24e90 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
24ea0 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
24eb0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
24ec0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
24ed0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24ee0 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
24ef0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
24f00 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
24f10 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
24f20 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
24f30 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
24f40 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
24f50 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
24f60 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
24f70 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24f80 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
24f90 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
24fa0 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
24fb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
24fc0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
24fd0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
24fe0 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
24ff0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
25000 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
25010 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
25020 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
25030 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
25040 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
25050 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
25060 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
25070 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
25080 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
25090 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
250a0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
250b0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
250c0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
250d0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
250e0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
250f0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
25100 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
25110 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
25120 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
25130 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
25140 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
25150 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
25160 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
25170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25180 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
25190 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
251a0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
251b0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
251c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
251d0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
251e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
251f0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
25200 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
25210 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
25220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
25230 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
25240 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
25250 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
25260 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
25270 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
25280 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
25290 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
252a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
252b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
252c0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
252d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
252e0 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  te>PAGER_UNLOCK 
252f0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
25300 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
25310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25320 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
25330 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
25340 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
25350 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
25360 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
25370 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
25380 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
25390 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
253a0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
253b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
253c0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e!=SQLITE_OK && 
253d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
253e0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
253f0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
25400 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
25410 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
25420 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
25430 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25440 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
25450 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
25460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25470 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
25480 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
25490 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
254a0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
254b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
254c0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
254d0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
254e0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
254f0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
25500 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
25510 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
25520 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
25530 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
25540 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
25550 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
25560 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
25570 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
25580 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
25590 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
255a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
255b0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
255c0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
255d0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
255e0 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ger ){.    /* In
255f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
25600 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
25610 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
25620 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
25630 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
25640 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
25650 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
25660 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
25670 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
25680 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
25690 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
256a0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
256b0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
256c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
256d0 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
256e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
256f0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
25700 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
25710 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
25720 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
25730 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
25740 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20      int nMax;.. 
25750 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
25760 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
25770 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
25780 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
25790 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
257a0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
257b0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
257c0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
257d0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
257e0 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
257f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
25800 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
25810 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
25820 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
25830 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
25840 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
25850 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
25860 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
25870 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25880 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25890 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
258a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
258b0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71    }..    rc = sq
258c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
258d0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
258e0 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
258f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25900 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
25910 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
25920 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  ..    if( nMax<(
25930 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
25940 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  B || noContent )
25950 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
25960 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
25970 29 7b 0a 09 72 63 20 3d 20 53 51 4c 49 54 45 5f  ){..rc = SQLITE_
25980 46 55 4c 4c 3b 0a 09 67 6f 74 6f 20 70 61 67 65  FULL;..goto page
25990 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
259a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
259b0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
259c0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
259d0 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
259e0 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
259f0 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
25a00 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
25a10 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
25a20 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
25a30 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
25a40 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
25a50 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
25a60 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
25a70 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
25a80 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
25a90 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
25aa0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
25ab0 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
25ac0 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
25ad0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
25ae0 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
25af0 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
25b00 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
25b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25b20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
25b30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
25b40 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
25b50 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
25b60 4f 72 69 67 53 69 7a 65 29 20 29 7b 0a 20 20 20  OrigSize) ){.   
25b70 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
25b80 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
25b90 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
25ba0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
25bb0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
25bc0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
25bd0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
25be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
25bf0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
25c00 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
25c10 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
25c20 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
25c30 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25c40 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
25c50 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
25c60 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
25c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25c80 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
25c90 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
25ca0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
25cb0 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  }.      IOTRACE(
25cc0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
25cd0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
25ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25cf0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
25d00 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
25d10 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
25d20 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
25d30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25d50 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
25d60 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
25d70 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
25d80 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
25d90 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
25da0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
25db0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
25dc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
25dd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
25de0 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
25df0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
25e00 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
25e10 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
25e20 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
25e30 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
25e40 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
25e50 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
25e60 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
25e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
25e80 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
25e90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
25ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
25eb0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
25ec0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
25ed0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
25ee0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
25ef0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
25f00 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25f10 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
25f20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
25f30 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
25f40 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
25f50 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
25f60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
25f70 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
25f80 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
25f90 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
25fa0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
25fb0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25fc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25fd0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
25fe0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
25ff0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
26000 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
26010 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
26020 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
26030 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
26040 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
26050 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
26060 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
26070 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
26080 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
26090 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
260a0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
260b0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
260c0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
260d0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
260e0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
260f0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
26100 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
26110 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
26120 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
26130 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
26140 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
26150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26160 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
26170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26180 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
26190 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
261a0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
261b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
261c0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
261d0 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
261e0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
261f0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
26200 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
26210 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
26220 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
26230 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
26240 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
26250 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
26260 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
26270 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
26280 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
26290 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
262a0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
262b0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
262c0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
262d0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
262e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
262f0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
26300 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
26310 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26320 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26330 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
26340 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
26350 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
26360 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
26370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
26380 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
26390 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
263a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
263b0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
263c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
263d0 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
263e0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
263f0 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
26400 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
26410 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
26420 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
26430 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
26440 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
26450 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a  rding to plan. .
26460 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45  ** An SQLITE_IOE
26470 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
26480 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
26490 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73   a call to .** s
264a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66  qlite3OsOpen() f
264b0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
264c0 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
264d0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
264e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
264f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
26500 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
26510 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
26520 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
26530 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
26540 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
26550 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
26560 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
26570 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
26580 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
26590 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
265a0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
265b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
265c0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
265d0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
265e0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
265f0 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
26600 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26620 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26630 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
26640 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
26650 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
26660 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
26670 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
26680 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
26690 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
266a0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
266b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
266c0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
266d0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
266e0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
266f0 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
26700 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
26710 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
26720 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
26730 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
26740 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
26750 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26760 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
26770 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26780 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
26790 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
267a0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
267b0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
267c0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
267d0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
267e0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
267f0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
26800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
26810 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
26820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26830 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
26840 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
26850 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
26860 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
26870 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26880 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
26890 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
268a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
268b0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
268c0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
268d0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
268e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
268f0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
26900 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
26910 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
26920 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
26930 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
26940 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
26950 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
26960 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
26970 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
26980 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
26990 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
269a0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
269b0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
269c0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
269d0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
269e0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
269f0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
26a00 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
26a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26a20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
26a30 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26a40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26a50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26a80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
26a90 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
26aa0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
26ab0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
26ac0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
26ad0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26ae0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
26af0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
26b00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
26b10 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
26b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
26b30 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
26b40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
26b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26b60 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26b70 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
26b80 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
26b90 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
26ba0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26bb0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
26bc0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
26bd0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
26be0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
26bf0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
26c00 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
26c10 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
26c20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
26c30 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
26c40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26c50 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  Code;..  /* TODO
26c60 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
26c70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
26c80 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
26c90 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
26ca0 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
26cb0 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
26cc0 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
26cd0 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
26ce0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
26cf0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
26d00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26d10 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
26d20 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
26d30 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
26d40 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
26d50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
26d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
26d70 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
26d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26d90 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
26da0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26db0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
26dc0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
26dd0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
26de0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26df0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
26e00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
26e10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26e20 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
26e30 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26e40 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
26e50 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
26e60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
26e70 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
26e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
26e90 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
26ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
26eb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
26ec0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
26ed0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
26ee0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
26ef0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
26f00 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26f10 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
26f20 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
26f30 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
26f40 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26f50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26f60 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
26f70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26f80 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
26f90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26fa0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
26fb0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
26fc0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26fd0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26fe0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
26ff0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
27000 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
27010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27020 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
27030 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
27040 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
27050 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
27060 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
27070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
27080 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27090 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
270a0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
270b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
270c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
270d0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
270e0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
270f0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
27100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
27110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27120 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
27130 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
27140 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
27150 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
27160 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
27170 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
27190 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
271a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
271b0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
271c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
271d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
271e0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
271f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
27200 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
27210 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
27220 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
27230 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
27240 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
27250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27260 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
27270 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
27280 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
27290 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
272a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
272b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
272c0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
272d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
272e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
272f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
27300 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27310 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
27320 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
27330 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
27340 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
27350 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
27360 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
27370 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
27380 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
27390 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
273a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
273b0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
273c0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
273d0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
273e0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
273f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27400 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
27410 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
27420 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
27430 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
27440 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
27450 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
27460 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
27470 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
27480 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
27490 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
274a0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
274b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
274c0 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
274d0 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
274e0 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
274f0 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
27500 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
27510 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
27520 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
27530 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
27540 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
27550 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
27560 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
27570 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
27580 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
27590 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
275a0 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
275b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
275c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
275d0 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
275e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
275f0 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
27600 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
27610 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
27620 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
27630 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
27640 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
27650 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
27660 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
27670 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
27680 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
27690 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
276a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
276b0 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
276c0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
276d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
276e0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
276f0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
27700 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
27710 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
27720 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
27730 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
27740 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
27750 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
27760 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
27770 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
27780 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
27790 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
277a0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
277b0 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
277c0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
277d0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
277e0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
277f0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
27800 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
27810 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
27820 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
27830 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
27840 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
27850 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27870 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
27880 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  _UNLOCK );.  ass
27890 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
278a0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61  Journal );.  pPa
278b0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
278c0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
278d0 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
278e0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
278f0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
27900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
27910 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
27920 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
27930 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
27940 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
27950 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
27960 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
27970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27980 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
27990 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
279a0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
279b0 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
279c0 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
279d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
279e0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
279f0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
27a00 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
27a10 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
27a20 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
27a30 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
27a40 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
27a50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
27a60 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27a70 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27a80 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
27a90 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
27aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27ab0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
27ac0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
27ad0 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
27ae0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
27af0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27b00 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
27b10 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
27b20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
27b30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
27b40 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
27b50 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
27b60 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
27b70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
27b80 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
27b90 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
27ba0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
27bb0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
27bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27bd0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
27be0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
27bf0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
27c00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
27c10 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
27c20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
27c30 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
27c40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27c50 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
27c60 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
27c70 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
27c80 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
27c90 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
27ca0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27cb0 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
27cc0 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
27cd0 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
27ce0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
27cf0 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
27d00 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
27d10 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
27d20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
27d30 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
27d40 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
27d50 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
27d60 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
27d70 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
27d80 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
27d90 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
27da0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
27db0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27dc0 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
27dd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27de0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
27df0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27e00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27e10 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
27e20 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
27e30 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27e40 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
27e50 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
27e60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27e70 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
27e80 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27e90 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27ea0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
27eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27ec0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
27ee0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
27ef0 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
27f00 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
27f10 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
27f20 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
27f30 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
27f40 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
27f50 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
27f60 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
27f70 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
27f80 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
27f90 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
27fa0 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
27fb0 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
27fc0 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
27fd0 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
27fe0 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
27ff0 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
28000 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
28010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
28020 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
28030 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28040 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
28050 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
28070 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
28080 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
28090 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
280a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
280b0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
280c0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
280d0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
280e0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
280f0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
28100 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
28110 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
28120 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
28130 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
28140 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
28150 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
28160 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
28170 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
28180 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
28190 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
281a0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
281b0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
281c0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
281d0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
281e0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
281f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
28200 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
28210 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28220 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
28230 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f   has been previo
28240 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 77  usly detected, w
28250 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a  e should not be.
28260 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69    ** calling thi
28270 73 20 72 6f 75 74 69 6e 65 2e 20 20 52 65 70 65  s routine.  Repe
28280 61 74 20 74 68 65 20 65 72 72 6f 72 20 66 6f 72  at the error for
28290 20 72 6f 62 75 73 74 6e 65 73 73 2e 0a 20 20 2a   robustness..  *
282a0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
282b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
282c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
282d0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
282e0 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
282f0 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
28300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28310 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
28320 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
28330 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
28340 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
28350 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
28360 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
28370 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
28380 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
28390 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
283a0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
283b0 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
283c0 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
283d0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
283e0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
283f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
28400 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
28410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
28420 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
28430 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
28440 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28450 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
28460 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
28470 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62  nal(pPg) && !sub
28480 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
28490 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  g) ){.    pPager
284a0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
284b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
284c0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
284d0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
284e0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
284f0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
28500 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
28510 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
28520 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
28530 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
28540 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
28550 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
28560 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
28570 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
28580 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
28590 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
285a0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
285b0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
285c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
285d0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
285e0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
285f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
28600 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  egin(pPager, 0, 
28610 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
28620 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mory);.    if( r
28630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28650 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
28660 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
28670 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
28680 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
28690 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
286a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
286b0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
286c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
286d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
286e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
286f0 61 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  al );.      rc =
28700 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
28710 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
28720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28730 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
28750 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
28760 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
28770 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
28780 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
28790 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
287a0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
287b0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
287c0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
287d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
287e0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
287f0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
28800 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28810 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
28820 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
28830 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
28840 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
28850 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65  al(pPg) && isOpe
28860 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
28870 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  {.      if( pPg-
28880 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
28890 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
288a0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
288b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
288c0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
288d0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
288e0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
288f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
28900 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
28910 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
28920 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
28930 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
28940 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
28950 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
28960 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
28970 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28980 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
28990 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
289a0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
289b0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
289c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
289d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
289e0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
289f0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
28a00 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
28a10 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
28a20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28a30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28a40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
28a50 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
28a60 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
28a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28a80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28a90 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28aa0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
28ab0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
28ac0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28af0 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
28b00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
28b20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
28b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28b40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28b60 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
28b70 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
28b80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28b90 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
28ba0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28bb0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
28bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28bd0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
28be0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
28bf0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
28c00 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
28c10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28c20 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
28c30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
28c40 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
28c50 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
28c60 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
28c70 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28c80 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
28c90 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
28ca0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
28cb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28cc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
28cd0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
28ce0 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
28cf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28d00 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
28d10 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
28d20 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  )));..        /*
28d30 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
28d40 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
28d50 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
28d60 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
28d70 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
28d80 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
28d90 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
28da0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
28db0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
28dc0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
28dd0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
28de0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
28df0 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
28e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
28e10 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
28e20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
28e30 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
28e40 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
28e50 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
28e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
28e70 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
28e80 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
28e90 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
28ea0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
28eb0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
28ec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28ed0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
28ee0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28ef0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28f00 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28f10 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28f20 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28f30 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  1;.        }..  
28f40 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
28f50 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77  r has occurred w
28f60 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
28f70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
28f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
28f90 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
28fa0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
28fb0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
28fc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29000 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
29010 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
29020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29030 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29040 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
29050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
29060 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
29070 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
29080 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
29090 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
290a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
290b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
290c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
290d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
290e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
290f0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
29100 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
29110 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
29120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29140 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
29150 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
29160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29190 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
291a0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
291b0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
291c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
291d0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
291e0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
291f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
29200 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
29220 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
29230 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
29240 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
29260 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
29270 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
29280 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
29290 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
292a0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
292b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
292c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
292d0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
292e0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
292f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
29300 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
29310 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
29320 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
29330 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
29340 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
29350 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
29360 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
29370 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
29380 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
29390 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
293a0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
293b0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
293c0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
293d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
293e0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
293f0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
29400 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
29410 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29420 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
29430 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
29440 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
29450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29460 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
29470 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
29480 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
29490 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
294a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
294b0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
294c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
294d0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
294e0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
294f0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
29500 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
29510 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
29520 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
29530 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
29540 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
29550 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
29560 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
29570 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
29580 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
29590 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
295a0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
295b0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
295c0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
295d0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
295e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
295f0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
29600 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
29610 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
29620 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
29630 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
29640 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
29650 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
29660 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
29670 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
29680 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
29690 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
296a0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
296b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
296c0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
296d0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
296e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
296f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
29700 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29710 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
29720 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
29730 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
29740 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
29750 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
29760 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
29770 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29780 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
29790 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
297a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
297b0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
297c0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
297d0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
297e0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
297f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
29800 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
29810 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
29820 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
29830 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
29840 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
29850 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
29860 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
29870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29880 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
29890 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
298a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
298b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
298c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
298d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
298e0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
298f0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
29900 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29930 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
29940 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
29950 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
29960 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
29970 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
29980 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
29990 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
299a0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
299b0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
299c0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
299d0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
299e0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
299f0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
29a00 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
29a10 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
29a20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29a40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
29a50 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
29a60 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
29a70 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
29a80 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
29a90 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
29aa0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
29ab0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
29ac0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
29ad0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
29ae0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
29af0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
29b00 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
29b10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29b20 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29b30 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
29b40 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
29b50 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
29b60 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
29b70 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
29b80 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
29b90 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
29ba0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
29bb0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
29bc0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
29bd0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
29be0 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
29bf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
29c00 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
29c10 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
29c20 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29c30 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
29c40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29c50 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29c60 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
29c70 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
29c80 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
29c90 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
29ca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
29cb0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
29cc0 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
29cd0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
29ce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
29cf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
29d00 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
29d10 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
29d20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
29d30 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
29d40 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
29d50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29d60 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
29d70 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
29d80 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29db0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
29dc0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29df0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
29e00 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
29e10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29e20 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
29e30 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
29e40 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
29e50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
29e60 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
29e70 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
29e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29ea0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29eb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
29ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29ed0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
29ee0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
29ef0 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
29f00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29f10 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
29f20 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
29f30 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29f40 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
29f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29f60 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29f80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
29f90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29fa0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
29fb0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
29fc0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
29fd0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
29fe0 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
29ff0 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
2a000 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
2a010 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
2a020 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
2a030 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
2a040 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
2a050 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
2a060 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
2a070 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
2a080 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
2a090 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
2a0a0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
2a0b0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2a0c0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2a0d0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2a0e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a0f0 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79  ITE_OK && needSy
2a100 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
2a110 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
2a120 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
2a130 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
2a140 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b  0; ii<nPage; ii+
2a150 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
2a160 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
2a170 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
2a180 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
2a190 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
2a1a0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66          pPage->f
2a1b0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
2a1c0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
2a1d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2a1e0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2a1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a200 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
2a210 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
2a220 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
2a230 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2a240 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
2a250 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
2a260 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2a270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2a280 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
2a290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a2a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2a2b0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
2a2c0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
2a2d0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
2a2e0 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
2a2f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a300 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
2a310 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
2a320 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
2a330 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
2a340 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
2a350 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
2a360 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
2a370 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2a380 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
2a390 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
2a3a0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2a3b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2a3c0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
2a3d0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
2a3e0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
2a3f0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2a400 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
2a410 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
2a420 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
2a430 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
2a440 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
2a450 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
2a460 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
2a470 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
2a480 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
2a490 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
2a4a0 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
2a4b0 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
2a4c0 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
2a4d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
2a4e0 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
2a4f0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
2a500 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
2a510 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2a520 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
2a530 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
2a540 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
2a550 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
2a560 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
2a570 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
2a580 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
2a590 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
2a5a0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
2a5b0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
2a5c0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
2a5d0 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
2a5e0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
2a5f0 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
2a600 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
2a610 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2a620 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2a630 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2a640 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a650 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
2a660 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
2a670 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
2a680 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
2a690 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
2a6a0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
2a6b0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
2a6c0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
2a6d0 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
2a6e0 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
2a6f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
2a700 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
2a710 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2a720 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
2a730 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
2a740 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
2a750 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
2a760 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
2a770 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
2a780 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a790 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
2a7a0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2a7b0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
2a7c0 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
2a7d0 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
2a7e0 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
2a7f0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2a800 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
2a810 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
2a820 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
2a830 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2a840 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
2a850 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
2a860 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
2a870 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
2a880 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2a890 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
2a8a0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
2a8b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2a8c0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
2a8d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
2a8e0 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
2a8f0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
2a900 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2a910 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
2a920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
2a930 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
2a940 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
2a950 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
2a960 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
2a970 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
2a980 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a990 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
2a9a0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2a9b0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
2a9c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a9d0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
2a9e0 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
2a9f0 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
2aa00 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
2aa10 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
2aa20 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
2aa30 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
2aa40 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
2aa50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2aa60 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
2aa70 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
2aa80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2aa90 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
2aaa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2aab0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  E_OK;..  /* Decl
2aac0 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
2aad0 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
2aae0 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
2aaf0 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
2ab00 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2ab10 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
2ab20 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
2ab30 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
2ab40 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
2ab50 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
2ab60 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
2ab70 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
2ab80 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
2ab90 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
2aba0 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
2abb0 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
2abc0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
2abd0 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
2abe0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2abf0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
2ac00 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
2ac10 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2ac20 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
2ac30 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
2ac40 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
2ac50 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
2ac60 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
2ac70 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
2ac80 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
2ac90 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
2aca0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
2acb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2acc0 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e  IC_WRITE.# defin
2acd0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a  e DIRECT_MODE 0.
2ace0 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
2acf0 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
2ad00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ad10 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
2ad20 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49  else.# define DI
2ad30 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65  RECT_MODE isDire
2ad40 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20  ctMode.#endif.. 
2ad50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ad60 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2ad70 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
2ad80 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
2ad90 6f 75 6e 74 44 6f 6e 65 20 26 26 20 41 4c 57 41  ountDone && ALWA
2ada0 59 53 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  YS(pPager->dbSiz
2adb0 65 3e 30 29 20 29 7b 0a 20 20 20 20 50 67 48 64  e>0) ){.    PgHd
2adc0 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
2add0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
2ade0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2adf0 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e   */.    u32 chan
2ae00 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  ge_counter;     
2ae10 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2ae20 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65   value of change
2ae30 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a  -counter field *
2ae40 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2ae50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ae60 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2ae70 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
2ae80 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
2ae90 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
2aea0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
2aeb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2aec0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
2aed0 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
2aee0 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
2aef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2af00 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
2af10 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
2af20 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
2af30 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
2af40 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
2af50 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
2af60 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
2af70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20  age 1 writable. 
2af80 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20   When not in .  
2af90 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65    ** direct mode
2afa0 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61  , page 1 is alwa
2afb0 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  ys held in cache
2afc0 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50   and hence the P
2afd0 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a  agerGet().    **
2afe0 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73   above is always
2aff0 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65   successful - he
2b000 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f  nce the ALWAYS o
2b010 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e  n rc==SQLITE_OK.
2b020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b030 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20  !DIRECT_MODE && 
2b040 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54  ALWAYS(rc==SQLIT
2b050 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
2b060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b070 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
2b080 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
2b090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b0a0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
2b0b0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
2b0c0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
2b0d0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
2b0e0 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  24. */.      cha
2b0f0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
2b100 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
2b110 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
2b120 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68  eVers);.      ch
2b130 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
2b140 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
2b150 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
2b160 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
2b170 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
2b180 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
2b190 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
2b1a0 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
2b1b0 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
2b1c0 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
2b1d0 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
2b1e0 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
2b1f0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2b200 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2b210 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b220 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2b230 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2b240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2b250 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2b260 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2b270 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2b280 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b2a0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2b2b0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2b2c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b2e0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2b2f0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2b300 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2b310 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
2b320 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
2b330 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
2b340 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
2b350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2b370 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
2b380 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
2b390 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
2b3a0 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
2b3b0 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
2b3c0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
2b3d0 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
2b3e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2b3f0 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
2b400 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
2b410 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
2b420 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
2b430 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
2b440 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
2b450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2b460 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2b470 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2b480 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2b490 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b4c0 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
2b4d0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
2b4e0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2b4f0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2b500 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b510 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2b520 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2b530 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2b540 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2b550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b560 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2b570 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2b580 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2b590 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2b5a0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2b5b0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2b5c0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2b5d0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2b5e0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2b5f0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2b600 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2b610 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2b620 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2b630 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2b640 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2b650 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2b660 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2b670 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2b680 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2b690 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2b6a0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2b6b0 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2b6c0 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2b6d0 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2b6e0 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
2b6f0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2b700 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
2b710 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
2b720 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
2b730 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b740 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
2b750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b760 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
2b770 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
2b780 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
2b790 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
2b7a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
2b7b0 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
2b7c0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
2b7d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2b7e0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
2b7f0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2b800 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
2b810 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
2b820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2b830 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
2b840 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b850 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
2b860 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
2b870 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
2b880 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
2b890 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
2b8a0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
2b8b0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2b8c0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2b8d0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2b8e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2b8f0 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2b900 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2b910 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2b920 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2b930 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2b940 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2b950 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2b960 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2b970 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2b980 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b990 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2b9a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2b9b0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2b9c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2b9d0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2b9e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b9f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2ba00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2ba30 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2ba40 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2ba50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2ba60 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2ba70 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2ba80 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2bab0 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2bac0 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2bad0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2bae0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2baf0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2bb00 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
2bb10 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e   dbOrigSize is n
2bb20 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72  ever set if jour
2bb30 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a  nal_mode=OFF */.
2bb40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2bb50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2bb60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bb70 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e  _OFF || pPager->
2bb80 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2bb90 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
2bba0 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
2bbb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
2bbc0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2bbd0 6c 65 64 2e 20 20 52 4f 4c 4c 42 41 43 4b 0a 20  led.  ROLLBACK. 
2bbe0 20 2a 2a 20 69 73 20 74 68 65 20 61 70 70 72 6f   ** is the appro
2bbf0 70 72 69 61 74 65 20 72 65 73 70 6f 6e 73 65 20  priate response 
2bc00 74 6f 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74  to an error, not
2bc10 20 43 4f 4d 4d 49 54 2e 20 20 47 75 61 72 64 20   COMMIT.  Guard 
2bc20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 63 6f 64  against.  ** cod
2bc30 69 6e 67 20 65 72 72 6f 72 73 20 62 79 20 72 65  ing errors by re
2bc40 70 65 61 74 69 6e 67 20 74 68 65 20 70 72 69 6f  peating the prio
2bc50 72 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66  r error. */.  if
2bc60 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2bc70 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2bc80 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2bc90 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
2bca0 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
2bcb0 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
2bcc0 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
2bcd0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
2bce0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
2bcf0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
2bd00 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45  ize));..  if( ME
2bd10 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
2bd20 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
2bd30 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2bd40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
2bd50 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
2bd60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2bd70 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  , or this.    **
2bd80 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
2bd90 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2bda0 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20  d, it is mostly 
2bdb0 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65  a no-op.  Howeve
2bdc0 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61  r, any.    ** ba
2bdd0 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73  ckup in progress
2bde0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
2bdf0 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tarted..    */. 
2be00 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2be10 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
2be20 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
2be30 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
2be40 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
2be50 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
2be60 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20  odified ){..    
2be70 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2be80 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2be90 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2bea0 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2beb0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68  t.    ** does th
2bec0 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2bed0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2bee0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2bef0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2bf00 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
2bf10 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2bf20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
2bf30 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
2bf40 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  e .    ** runtim
2bf50 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
2bf60 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
2bf70 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2bf80 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2bf90 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2bfa0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2bfb0 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2bfc0 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
2bfd0 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
2bfe0 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20  , and .    **   
2bff0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2c000 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2c010 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2c020 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2c030 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2c040 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2c050 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2c060 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2c070 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
2c080 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
2c090 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
2c0a0 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
2c0b0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2c0c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
2c0d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c0e0 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
2c0f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
2c100 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
2c110 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
2c120 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
2c130 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
2c140 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
2c150 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a  ed in but.    **
2c160 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2c170 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2c180 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2c190 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2c1a0 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e().    ** to ma
2c1b0 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
2c1c0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
2c1d0 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
2c1e0 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
2c1f0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2c200 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2c210 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2c220 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2c230 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20  indirect.    ** 
2c240 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  mode. .    **.  
2c250 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2c260 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2c270 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
2c280 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
2c290 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  le,.    ** then 
2c2a0 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
2c2b0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2c2c0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2c2d0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
2c2e0 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
2c2f0 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2c300 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2c310 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
2c320 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2c330 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2c340 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  ction..    */.#i
2c350 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2c360 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2c370 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2c380 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2c390 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2c3a0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2c3b0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2c3c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2c3d0 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
2c3e0 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
2c3f0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26  er->jfd) .     &
2c400 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2c410 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
2c420 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
2c430 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2c440 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Size>=pPager->db
2c450 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26  FileSize.     &&
2c460 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2c470 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2c480 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2c490 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2c4a0 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
2c4b0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2c4c0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
2c4d0 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
2c4e0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
2c4f0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
2c500 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2c510 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2c520 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2c530 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2c540 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2c550 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2c560 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2c570 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2c580 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2c590 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
2c5a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c5b0 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
2c5c0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c5d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  e .      ** prop
2c5e0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
2c5f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
2c600 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
2c610 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2c620 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2c630 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2c640 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2c650 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c660 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2c670 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2c680 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c6a0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c6b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c6c0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2c6d0 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20   }.    }.#else. 
2c6e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c6f0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c700 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e  (pPager, 0);.#en
2c710 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2c720 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c730 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c740 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2c750 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2c760 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2c770 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2c780 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2c790 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64  s.    ** being d
2c7a0 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
2c7b0 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
2c7c0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2c7d0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
2c7e0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
2c7f0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
2c800 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
2c810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
2c820 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2c830 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2c840 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2c850 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a   than the .    *
2c860 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
2c870 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
2c880 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
2c890 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
2c8a0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
2c8b0 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
2c8c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2c8d0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
2c8e0 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  e.    ** calls t
2c8f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2c900 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2c910 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2c920 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  of .    ** readi
2c930 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2c940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2c950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68      **.    ** Wh
2c960 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  en journal_mode=
2c970 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53  =OFF the dbOrigS
2c980 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65  ize is always ze
2c990 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20  ro, so this.    
2c9a0 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72  ** block never r
2c9b0 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  uns if journal_m
2c9c0 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a  ode=OFF..    */.
2c9d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c9e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2c9f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2ca00 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
2ca10 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26  OrigSize .     &
2ca20 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  & ALWAYS(pPager-
2ca30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2ca40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ca50 4f 46 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF).    ){.    
2ca60 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20    Pgno i;       
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ca90 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2caa0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2cab0 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
2cac0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2cad0 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c  r); /* Pending l
2cae0 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ock page */.    
2caf0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53    const Pgno dbS
2cb00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2cb10 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44  Size;       /* D
2cb20 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69  atabase image si
2cb30 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61  ze */ .      pPa
2cb40 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
2cb50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2cb60 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64  ;.      for( i=d
2cb70 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
2cb80 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
2cb90 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i++ ){.        i
2cba0 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
2cbb0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2cbc0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
2cbd0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
2cbe0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2cbf0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2cc00 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
2cc10 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
2cc20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2cc30 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
2cc40 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
2cc50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cc60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2cc70 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cc80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  t;.          rc 
2cc90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2cca0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
2ccb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2ccc0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2ccd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2cce0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2ccf0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cd00 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2cd10 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
2cd20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
2cd30 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
2cd40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2cd50 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
2cd60 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
2cd70 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2cd80 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65  file. If a maste
2cd90 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  r .    ** journa
2cda0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
2cdb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2cdc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2cdd0 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a  nal file, .    *
2cde0 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20  * or if zMaster 
2cdf0 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74  is NULL (no mast
2ce00 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65  er journal), the
2ce10 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
2ce20 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
2ce30 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
2ce40 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
2ce50 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
2ce60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ce70 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2ce80 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2ce90 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
2cea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2ceb0 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
2cec0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
2ced0 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  n is being.    *
2cee0 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c  * used, this cal
2cef0 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74  l will not creat
2cf00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2cf10 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e  le or perform an
2cf20 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f  y.    ** real IO
2cf30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2cf40 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2cf50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
2cf60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2cf70 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2cf80 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2cf90 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
2cfa0 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
2cfb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2cfc0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
2cfd0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2cfe0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2cff0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2d000 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66  PCache));.    if
2d010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d020 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d030 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
2d040 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
2d050 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70     goto commit_p
2d060 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2d070 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2d080 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2d090 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2d0a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2d0b0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
2d0c0 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
2d0d0 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
2d0e0 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20  e image,.    ** 
2d0f0 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74  then use pager_t
2d100 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20  runcate to grow 
2d110 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69  or shrink the fi
2d120 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  le here..    */.
2d130 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2d140 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
2d150 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2d160 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20      Pgno nNew = 
2d170 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d  pPager->dbSize -
2d180 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
2d190 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
2d1a0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
2d1b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d1c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2d1d0 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
2d1e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
2d1f0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
2d200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2d220 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2d230 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  ne_exit;.    }..
2d240 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
2d250 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
2d260 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2d270 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2d280 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
2d290 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d2a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2d2b0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2d2c0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
2d2d0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
2d2e0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
2d2f0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
2d300 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2d310 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f  _SYNCED;.  }..co
2d320 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2d330 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
2d340 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ;.}.../*.** When
2d350 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d360 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61  s called, the da
2d370 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2d380 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  been completely.
2d390 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  ** updated to re
2d3a0 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65  flect the change
2d3b0 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75  s made by the cu
2d3c0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2d3d0 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20  n and.** synced 
2d3e0 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75  to disk. The jou
2d3f0 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20  rnal file still 
2d400 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2d410 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68  le-system .** th
2d420 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66  ough, and if a f
2d430 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74  ailure occurs at
2d440 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
2d450 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a  ill eventually.*
2d460 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68  * be used as a h
2d470 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  ot-journal and t
2d480 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2d490 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61  action rolled ba
2d4a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
2d4b0 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65  unction finalize
2d4c0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
2d4d0 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65  le, either by de
2d4e0 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e  leting, .** trun
2d4f0 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61  cating or partia
2d500 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20  lly zeroing it, 
2d510 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f  so that it canno
2d520 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  t be used .** fo
2d530 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  r hot-journal ro
2d540 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69  llback. Once thi
2d550 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72  s is done the tr
2d560 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
2d570 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d  irrevocably comm
2d580 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
2d590 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d5a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2d5b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2d5c0 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d  d the pager.** m
2d5d0 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72  oves into the er
2d5e0 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ror state. Other
2d5f0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
2d600 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2d610 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2d620 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
2d630 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2d640 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d650 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2d660 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d670 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2d680 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2d690 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
2d6a0 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  if a prior error
2d6b0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20   has occurred.. 
2d6c0 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20   ** But if (due 
2d6d0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2d6e0 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74  r elsewhere in t
2d6f0 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f  he system) it do
2d700 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c  es get.  ** call
2d710 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  ed, just return 
2d720 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
2d730 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  ode without doin
2d740 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20  g anything. */. 
2d750 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2d760 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2d770 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2d780 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Code;..  /* This
2d790 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2d7a0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
2d7b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
2d7c0 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20  ot in at least. 
2d7d0 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
2d7e0 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e  ED state. And in
2d7f0 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65  deed SQLite neve
2d800 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74  r does this. But
2d810 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65   it is.  ** nice
2d820 20 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65   to have this de
2d830 66 65 6e 73 69 76 65 20 74 65 73 74 20 68 65 72  fensive test her
2d840 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  e anyway..  */. 
2d850 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2d860 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
2d870 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72  ESERVED) ) retur
2d880 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2d890 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a  .  /* An optimiz
2d8a0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61  ation. If the da
2d8b0 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61  tabase was not a
2d8c0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64  ctually modified
2d8d0 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69   during.  ** thi
2d8e0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  s transaction, t
2d8f0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2d900 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2d910 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a  -mode and is.  *
2d920 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65  * using persiste
2d930 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  nt journals, the
2d940 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2d950 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
2d960 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20  .  ** The start 
2d970 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2d980 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
2d990 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
2d9a0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d9b0 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52  ader with the nR
2d9c0 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20  ec field set to 
2d9d0 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75  0. If such a jou
2d9e0 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a  rnal is used as.
2d9f0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
2da00 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  al during hot-jo
2da10 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
2da20 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  0 changes will b
2da30 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74  e made.  ** to t
2da40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2da50 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  . So there is no
2da60 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68   need to zero th
2da70 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2da80 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68  header. Since th
2da90 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
2daa0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
2dab0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
2dac0 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20   ** to drop any 
2dad0 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20  locks either..  
2dae0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
2daf0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
2db00 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
2db10 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70  iveMode .   && p
2db20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2db30 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2db40 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
2db50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2db60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2db70 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
2db80 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
2db90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2dba0 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  K;.  }..  PAGERT
2dbb0 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64  RACE(("COMMIT %d
2dbc0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2dbd0 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
2dbe0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2dbf0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
2dc00 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65   MEMDB || !pPage
2dc10 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
2dc20 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
2dc30 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2dc40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2dc50 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  tMaster);.  retu
2dc60 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2dc70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
2dc80 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
2dc90 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64  l changes. The d
2dca0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
2dcb0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
2dcc0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ED mode..**.** T
2dcd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
2dce0 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a  forms two tasks:
2dcf0 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72  .**.**   1) It r
2dd00 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f  olls back the jo
2dd10 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74  urnal file, rest
2dd20 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61  oring all databa
2dd30 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  se file and .** 
2dd40 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63       in-memory c
2dd50 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68  ache pages to th
2dd60 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72  e state they wer
2dd70 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72  e in when the tr
2dd80 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  ansaction.**    
2dd90 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e    was opened, an
2dda0 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e  d.**   2) It fin
2ddb0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2ddc0 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74  al file, so that
2ddd0 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   it is not used 
2dde0 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20  for hot.**      
2ddf0 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20  rollback at any 
2de00 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
2de10 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65  ure..**.** subje
2de20 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
2de30 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f  ing qualificatio
2de40 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74  ns:.**.** * If t
2de50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2de60 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20  is not yet open 
2de70 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2de80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  on is called,.**
2de90 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29     then only (2)
2dea0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49   is performed. I
2deb0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2dec0 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20  e is no journal 
2ded0 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c  file.**   to rol
2dee0 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20  l back..**.** * 
2def0 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  If in an error s
2df00 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
2df10 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65  SQLITE_FULL, the
2df20 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a  n task (1) is .*
2df30 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49  *   performed. I
2df40 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61  f successful, ta
2df50 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65  sk (2). Regardle
2df60 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
2df70 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72  e.**   of either
2df80 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  , the error stat
2df90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2dfa0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
2dfb0 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65  caller.**   (i.e
2dfc0 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  . either SQLITE_
2dfd0 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f  IOERR or SQLITE_
2dfe0 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
2dff0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
2e000 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52  s in PAGER_RESER
2e010 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
2e020 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65  attempt (1). Whe
2e030 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74  ther.**   or not
2e040 20 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66   (1) is succussf
2e050 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74  ul, also attempt
2e060 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73   (2). If success
2e070 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20  ful, return.**  
2e080 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
2e090 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65  rwise, enter the
2e0a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
2e0b0 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   return the firs
2e0c0 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f  t .**   error co
2e0d0 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  de encountered. 
2e0e0 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
2e0f0 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
2e100 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
2e110 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77  e database was w
2e120 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20  ritten to. .**  
2e130 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66   So is safe to f
2e140 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
2e150 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66  nal file even if
2e160 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a   the playback .*
2e170 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31  *   (operation 1
2e180 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65  ) failed. Howeve
2e190 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74  r the pager must
2e1a0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
2e1b0 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74   state.**   as t
2e1c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2e1d0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
2e1e0 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65  he are now suspe
2e1f0 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61  ct..**.** * Fina
2e200 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52  lly, if in PAGER
2e210 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65  _EXCLUSIVE state
2e220 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2e230 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74  1). Only.**   at
2e240 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29  tempt (2) if (1)
2e250 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
2e260 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2e270 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   if successful,.
2e280 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65  **   otherwise e
2e290 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2e2a0 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
2e2b0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66  the error code f
2e2c0 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61  rom the .**   fa
2e2d0 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  iling operation.
2e2e0 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73  .**.**   In this
2e2f0 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61   case the databa
2e300 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65  se file may have
2e310 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2e320 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20  . So if the.**  
2e330 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
2e340 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63  ion did not succ
2e350 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  eed it would not
2e360 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61   be safe to fina
2e370 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f  lize.**   the jo
2e380 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e  urnal file. It n
2e390 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20  eeds to be left 
2e3a0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
2e3b0 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20  em so that.**   
2e3c0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
2e3d0 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f  ss can use it to
2e3e0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e3f0 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a  abase state (by.
2e400 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  **   hot-journal
2e410 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69   rollback)..*/.i
2e420 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
2e430 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
2e440 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2e450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e470 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e480 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2e490 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
2e4a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2e4b0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2e4c0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20  ->dbModified || 
2e4d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2e4e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  jfd) ){.    rc =
2e4f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2e500 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
2e510 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2e520 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2e530 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
2e540 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
2e550 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
2e560 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2e570 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
2e580 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
2e590 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
2e5a0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2e5b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67   }.    rc = pPag
2e5c0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2e5d0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2e5e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
2e5f0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
2e600 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
2e610 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2e620 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e630 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20  0);.      rc2 = 
2e640 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2e650 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2e660 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2e670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2e680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e690 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
2e6a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e6b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2e6c0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e6d0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  er, 0);.    }.. 
2e6e0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
2e6f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2e700 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
2e710 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2e720 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2e730 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
2e740 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
2e750 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
2e760 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  ager.    ** cach
2e770 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
2e780 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
2e790 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
2e7a0 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a  any error .    *
2e7b0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
2e7c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
2e7d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2e7e0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
2e7f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e800 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2e810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e820 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
2e830 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
2e840 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
2e850 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
2e860 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
2e870 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61  .*/.u8 sqlite3Pa
2e880 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
2e890 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2e8a0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
2e8b0 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
2e8c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2e8d0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2e8e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
2e8f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e900 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
2e910 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2e920 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2e930 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2e940 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
2e950 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e960 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2e970 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65  ences to the spe
2e980 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
2e990 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e9a0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50  PageRefcount(DbP
2e9b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
2e9c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
2e9d0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
2e9e0 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65  pPage);.}..#ifde
2e9f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
2ea00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ea10 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
2ea20 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
2ea30 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
2ea40 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
2ea50 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
2ea60 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
2ea70 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73  [11];.  a[0] = s
2ea80 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2ea90 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2eaa0 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20  ache);.  a[1] = 
2eab0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
2eac0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
2ead0 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20  PCache);.  a[2] 
2eae0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47  = sqlite3PcacheG
2eaf0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
2eb00 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2eb10 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
2eb20 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e  bSizeValid ? (in
2eb30 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t) pPager->dbSiz
2eb40 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d  e : -1;.  a[4] =
2eb50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
2eb60 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
2eb70 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
2eb80 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
2eb90 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
2eba0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
2ebb0 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
2ebc0 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
2ebd0 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
2ebe0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
2ebf0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
2ec00 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
2ec10 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
2ec20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2ec30 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
2ec40 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f  memory pager..*/
2ec50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ec60 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a  rIsMemdb(Pager *
2ec70 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2ec80 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a  n MEMDB;.}../*.*
2ec90 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2eca0 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  re are at least 
2ecb0 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70  nSavepoint savep
2ecc0 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74  oints open. If t
2ecd0 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72  here are.** curr
2ece0 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  ently less than 
2ecf0 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e  nSavepoints open
2ed00 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20  , then open one 
2ed10 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
2ed20 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70  ts.** to make up
2ed30 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e   the difference.
2ed40 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
2ed50 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20  f savepoints is 
2ed60 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c  already.** equal
2ed70 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20   to nSavepoint, 
2ed80 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2ed90 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2eda0 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
2edb0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2edc0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
2edd0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2ede0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
2edf0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
2ee00 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  g the sub-journa
2ee10 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20  l file, then an 
2ee20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2ee30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
2ee40 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
2ee50 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
2ee60 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
2ee70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
2ee80 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  er, int nSavepoi
2ee90 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2eea0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eec0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2eed0 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e  */.  int nCurren
2eee0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  t = pPager->nSav
2eef0 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
2ef00 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
2ef10 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a   of savepoints *
2ef20 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f  /..  if( nSavepo
2ef30 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20  int>nCurrent && 
2ef40 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2ef50 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  al ){.    int ii
2ef60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2ef90 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61  riable */.    Pa
2efa0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
2efb0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2efc0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67        /* New Pag
2efd0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
2efe0 72 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45  ray */..    /* E
2eff0 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e  ither there is n
2f000 6f 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c  o active journal
2f010 20 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   or the sub-jour
2f020 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a  nal is open or .
2f030 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2f040 61 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  al is always sto
2f050 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f  red in memory */
2f060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f070 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
2f080 3d 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  =0 || isOpen(pPa
2f090 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20  ger->sjfd) ||.  
2f0a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2f0b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2f0c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2f0d0 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20  _MEMORY );..    
2f0e0 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
2f0f0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2f100 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
2f110 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
2f120 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
2f130 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
2f140 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
2f150 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
2f160 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
2f170 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
2f180 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
2f190 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
2f1a0 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
2f1b0 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
2f1c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
2f1d0 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
2f1e0 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
2f1f0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
2f200 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
2f210 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2f220 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
2f230 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
2f240 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
2f250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f260 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
2f270 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
2f280 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
2f290 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
2f2a0 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
2f2b0 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
2f2c0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2f2d0 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50  t = aNew;.    pP
2f2e0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2f2f0 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
2f300 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
2f310 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
2f320 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
2f330 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
2f340 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
2f350 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
2f360 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2f370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f380 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
2f390 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2f3a0 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e  nOrig = pPager->
2f3b0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  dbSize;.      if
2f3c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2f3d0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
2f3e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b  >journalOff>0 ){
2f3f0 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69  .        aNew[ii
2f400 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ].iOffset = pPag
2f410 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
2f420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f430 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2f440 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ffset = JOURNAL_
2f450 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
2f460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e        }.      aN
2f470 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d  ew[ii].iSubRec =
2f480 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2f490 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
2f4a0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  .pInSavepoint = 
2f4b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
2f4c0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
2f4d0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
2f4e0 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
2f4f0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
2f500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f510 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2f520 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e    }..    /* Open
2f530 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2f540 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2f550 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a  lready opened. *
2f560 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  /.    rc = openS
2f570 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2f580 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2f590 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2f5a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2f5b0 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
2f5c0 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
2f5d0 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
2f5e0 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
2f5f0 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
2f600 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
2f610 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
2f620 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
2f630 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
2f640 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
2f650 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
2f660 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
2f670 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
2f680 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
2f690 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
2f6a0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
2f6b0 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
2f6c0 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
2f6d0 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
2f6e0 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
2f6f0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
2f700 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
2f710 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
2f720 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
2f730 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
2f740 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
2f750 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
2f760 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
2f770 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
2f780 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
2f790 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
2f7a0 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
2f7b0 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
2f7c0 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
2f7d0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2f7e0 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2f7f0 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
2f800 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
2f810 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
2f820 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
2f830 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
2f840 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2f850 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
2f860 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
2f870 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
2f880 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
2f890 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
2f8a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f8b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2f8c0 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
2f8d0 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
2f8e0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2f8f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
2f900 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2f910 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
2f920 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
2f930 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
2f940 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
2f950 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
2f960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
2f970 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
2f980 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
2f990 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
2f9a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
2f9b0 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
2f9c0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
2f9d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2f9e0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
2f9f0 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
2fa00 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
2fa10 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
2fa20 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
2fa30 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
2fa40 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
2fa50 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
2fa60 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
2fa70 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
2fa80 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
2fa90 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
2faa0 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
2fab0 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
2fac0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2fad0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2fae0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
2faf0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
2fb00 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
2fb10 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2fb20 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2fb30 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
2fb40 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
2fb50 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
2fb60 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
2fb70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2fb80 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
2fb90 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
2fba0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2fbb0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
2fbc0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
2fbd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2fbe0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
2fbf0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
2fc00 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2fc10 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
2fc20 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
2fc30 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
2fc40 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
2fc50 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
2fc60 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2fc70 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
2fc80 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2fc90 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2fca0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
2fcb0 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
2fcc0 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
2fcd0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
2fce0 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
2fcf0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
2fd00 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
2fd10 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
2fd20 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
2fd30 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
2fd40 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
2fd50 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
2fd60 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
2fd70 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
2fd80 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
2fd90 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
2fda0 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
2fdb0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
2fdc0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2fdd0 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
2fde0 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  t + (op==SAVEPOI
2fdf0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  NT_ROLLBACK);.  
2fe00 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
2fe10 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
2fe20 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
2fe30 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2fe40 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
2fe50 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
2fe60 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
2fe70 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
2fe80 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
2fe90 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
2fea0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
2feb0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79   operation, play
2fec0 62 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69  back the specifi
2fed0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20  ed savepoint..  
2fee0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2fef0 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20  a temp-file, it 
2ff00 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
2ff10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ff20 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  e has.    ** not
2ff30 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2ff40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2ff50 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
2ff60 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20  o changes to.   
2ff70 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2ff80 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c   file, so the pl
2ff90 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
2ffa0 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
2ffb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ffc0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2ffd0 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e  LLBACK && isOpen
2ffe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2fff0 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
30000 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
30010 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
30020 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
30030 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
30040 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
30050 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
30060 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
30070 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
30080 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
30090 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
300a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
300b0 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f  release of the o
300c0 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
300d0 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20  nt, truncate .  
300e0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
300f0 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74  rnal to zero byt
30100 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
30110 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
30120 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
30130 52 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65  RELEASE && isOpe
30140 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
30150 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30170 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
30180 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
30190 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
301a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
301b0 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  SubRec = 0;.    
301c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
301d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
301e0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
301f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
30200 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
30210 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
30220 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
30230 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30240 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30250 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
30260 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
30270 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
30280 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
30290 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
302a0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
302b0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
302c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
302d0 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
302e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
302f0 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
30300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
30310 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
30320 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
30330 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
30340 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
30350 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
30360 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
30370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
30380 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
30390 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
303a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
303b0 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
303c0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
303d0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
303e0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
303f0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
30400 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
30410 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
30420 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30430 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
30440 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
30450 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
30460 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
30470 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
30480 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
30490 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
304a0 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
304b0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
304c0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
304d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
304e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
304f0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
30500 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
30510 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72  C./*.** Set or r
30520 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65  etrieve the code
30530 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
30540 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30550 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
30560 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
30570 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
30580 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
30590 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
305a0 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
305b0 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
305c0 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  nt,int),.  void 
305d0 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f  (*xCodecFree)(vo
305e0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  id*),.  void *pC
305f0 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50  odec.){.  if( pP
30600 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
30610 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
30620 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
30630 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  odec);.  pPager-
30640 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
30650 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
30660 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f  ecSizeChng = xCo
30670 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70  decSizeChng;.  p
30680 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
30690 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a  e = xCodecFree;.
306a0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
306b0 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67   = pCodec;.  pag
306c0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
306d0 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ger);.}.static v
306e0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
306f0 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20  rGetCodec(Pager 
30700 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
30710 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  rn pPager->pCode
30720 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
30730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30740 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
30750 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
30760 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
30770 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
30780 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
30790 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
307a0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
307b0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
307c0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
307d0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
307e0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
307f0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
30800 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
30810 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
30820 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
30830 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
30840 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
30850 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
30860 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
30870 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
30880 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
30890 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
308a0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
308b0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
308c0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
308d0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
308e0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
308f0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
30900 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
30910 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
30920 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
30930 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
30940 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
30950 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
30960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
30970 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
30980 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30990 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
309a0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
309b0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
309c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
309d0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
309e0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
309f0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
30a00 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
30a10 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
30a20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
30a30 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
30a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
30a50 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
30a60 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
30a70 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
30a80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
30a90 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
30aa0 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
30ab0 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
30ac0 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
30ad0 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
30ae0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
30af0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
30b00 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
30b10 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
30b20 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
30b30 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
30b40 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
30b50 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
30b60 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
30b70 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
30b80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
30b90 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
30ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
30bb0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
30bc0 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
30bd0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
30be0 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
30bf0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
30c00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
30c10 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
30c20 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
30c30 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
30c40 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
30c50 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30c70 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
30c80 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
30c90 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
30ca0 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
30cb0 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
30cc0 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
30cd0 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
30ce0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30d10 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
30d20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
30d30 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
30d40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
30d50 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
30d60 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
30d70 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  If the page bein
30d80 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79  g moved is dirty
30d90 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65   and has not bee
30da0 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c  n saved by the l
30db0 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70  atest.  ** savep
30dc0 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20  oint, then save 
30dd0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
30de0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30df0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
30e00 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e  sub-journal now.
30e10 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
30e20 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
30e30 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
30e40 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  io:.  **.  **   
30e50 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
30e60 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c  <journal page X,
30e70 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20   then modify it 
30e80 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20  in memory>.  ** 
30e90 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
30ea0 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d  e;.  **       <M
30eb0 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f  ove page X to lo
30ec0 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20  cation Y>.  **  
30ed0 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
30ee0 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ne;.  **.  ** If
30ef0 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74   page X were not
30f00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
30f10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65  sub-journal here
30f20 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20  , it would not. 
30f30 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
30f40 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63  to restore its c
30f50 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65  ontents when the
30f60 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e   "ROLLBACK TO on
30f70 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  e".  ** statemen
30f80 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73  t were is proces
30f90 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73  sed..  **.  ** s
30fa0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20  ubjournalPage() 
30fb0 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f  may need to allo
30fc0 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74  cate space to st
30fd0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
30fe0 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d  to.  ** one or m
30ff0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69  ore savepoint bi
31000 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74  tvecs. This is t
31010 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66  he reason this f
31020 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79  unction.  ** may
31030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31040 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  OMEM..  */.  if(
31050 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
31060 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73  R_DIRTY .   && s
31070 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
31080 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54  pPg).   && SQLIT
31090 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a  E_OK!=(rc = subj
310a0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29  ournalPage(pPg))
310b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
310c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
310d0 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64  RTRACE(("MOVE %d
310e0 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
310f0 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
31100 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
31110 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
31120 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e  Pg->pgno, (pPg->
31130 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
31140 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f  _SYNC)?1:0, pgno
31150 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
31160 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
31170 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
31180 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f  gno, pgno))..  /
31190 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
311a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
311b0 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
311c0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
311d0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
311e0 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
311f0 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
31200 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
31210 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
31220 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
31230 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
31240 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
31250 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
31260 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
31270 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
31280 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
31290 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
312a0 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
312b0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
312c0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
312d0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
312e0 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
312f0 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
31300 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
31310 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
31320 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
31330 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
31340 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
31350 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
31360 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
31370 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
31380 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
31390 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
313a0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
313b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
313c0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
313d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
313e0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
313f0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
31400 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
31410 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
31420 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
31430 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
31440 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
31450 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
31460 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
31470 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
31480 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
31490 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
314a0 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
314b0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
314c0 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
314d0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
314e0 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
314f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
31500 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
31510 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
31520 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
31530 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
31540 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
31550 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
31560 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
31570 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NC);.    sqlite3
31580 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
31590 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50  d);.  }..  origP
315a0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
315b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
315c0 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b  Move(pPg, pgno);
315d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
315e0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
315f0 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
31600 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
31610 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
31620 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
31630 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
31640 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
31650 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
31660 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
31670 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
31680 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
31690 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
316a0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
316b0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
316c0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
316d0 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
316e0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
316f0 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
31700 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
31710 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
31720 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
31730 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
31740 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
31750 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
31760 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
31770 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
31780 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
31790 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
317a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
317b0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
317c0 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
317d0 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
317e0 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
317f0 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
31800 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
31810 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
31820 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
31830 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
31840 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
31850 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
31860 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
31870 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
31880 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
31890 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
318a0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
318b0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
318c0 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
318d0 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
318e0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
318f0 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
31900 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
31910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
31920 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
31930 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
31940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
31950 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31960 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
31970 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
31980 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
31990 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
319a0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
319b0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
319c0 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
319d0 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
319e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
319f0 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
31a00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
31a10 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
31a20 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
31a30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31a50 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
31a60 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
31a70 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
31a80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31a90 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b  >pTmpSpace!=0 );
31aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31ab0 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
31ac0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
31ad0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50  needSyncPgno, pP
31ae0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
31af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
31b10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
31b20 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
31b30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
31b40 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
31b50 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
31b60 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
31b70 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
31b80 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
31b90 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
31ba0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31bb0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
31bc0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f   }..  /*.  ** Fo
31bd0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
31be0 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75  atabase, make su
31bf0 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
31c00 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20  page continues. 
31c10 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e   ** to exist, in
31c20 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
31c30 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72  ction needs to r
31c40 6f 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c  oll back.  We al
31c50 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  locate.  ** the 
31c60 70 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61  page now, instea
31c70 64 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b  d of at rollback
31c80 2c 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  , because we can
31c90 20 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a   better deal.  *
31ca0 2a 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  * with an out-of
31cb0 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f  -memory error no
31cc0 77 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36 31  w.  Ticket #3761
31cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
31ce0 44 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65  DB ){.    DbPage
31cf0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d   *pNew;.    rc =
31d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
31d10 75 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69  uire(pPager, ori
31d20 67 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29  gPgno, &pNew, 1)
31d30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31d50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
31d60 76 65 28 70 50 67 2c 20 6f 72 69 67 50 67 6e 6f  ve(pPg, origPgno
31d70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31d80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rc;.    }.    sq
31d90 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
31da0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
31db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31dc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
31dd0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31de0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
31df0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
31e00 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
31e10 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
31e20 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
31e30 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
31e40 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
31e50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
31e60 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
31e70 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
31e80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
31e90 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
31ea0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
31eb0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
31ec0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
31ed0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
31ee0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
31ef0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
31f00 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
31f10 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
31f20 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
31f30 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
31f40 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
31f50 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
31f60 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
31f70 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
31f80 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
31f90 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
31fa0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
31fb0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
31fc0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
31fd0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
31fe0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
31ff0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
32000 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
32010 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
32020 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
32030 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
32040 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
32050 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
32060 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
32070 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
32080 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
32090 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
320a0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
320b0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
320c0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
320d0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
320e0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
320f0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
32100 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
32110 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32120 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
32130 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32140 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
32150 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
32160 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32170 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
32180 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
32190 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
321a0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
321b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
321c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
321d0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
321e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
321f0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
32200 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
32210 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32220 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
32230 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
32240 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
32250 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
32260 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32270 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
32280 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
32290 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
322a0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
322b0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
322c0 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
322d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
322e0 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
322f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
32300 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
32310 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
32320 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
32330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
32340 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
32350 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
32360 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
32370 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
32380 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  Y.**.** If the p
32390 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
323a0 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
323b0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73   journal_mode is
323c0 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
323d0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69  alue specified i
323e0 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20  f the change is 
323f0 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68  allowed.  The ch
32400 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77  ange is disallow
32410 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f  ed.** for the fo
32420 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
32430 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69  .**.**   *  An i
32440 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
32450 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20  e can only have 
32460 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  its journal_mode
32470 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20   set to _OFF.** 
32480 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e       or _MEMORY.
32490 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
324a0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79  journal mode may
324b0 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20   not be changed 
324c0 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74  while a transact
324d0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
324e0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
324f0 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
32500 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
32510 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61   updated) journa
32520 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
32530 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
32540 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
32550 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
32560 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
32570 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32580 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
32590 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
325a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
325b0 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
325c0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
325d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325e0 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
325f0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32600 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32610 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
32620 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32630 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32640 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
32650 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
32660 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32670 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65  MEMORY );.  asse
32680 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
32690 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
326a0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a  .  if( eMode>=0.
326b0 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c     && (!MEMDB ||
326c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
326d0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
326e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
326f0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
32710 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
32720 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26  dbModified.   &&
32730 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   (!isOpen(pPager
32740 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61  ->jfd) || 0==pPa
32750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
32760 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  .  ){.    if( is
32770 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32780 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
32790 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
327a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  ->jfd);.    }.  
327b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
327c0 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
327d0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
327e0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75  (int)pPager->jou
327f0 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  rnalMode;.}../*.
32800 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73  ** Get/set the s
32810 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66  ize-limit used f
32820 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
32830 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
32840 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73  ** Setting the s
32850 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20  ize limit to -1 
32860 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69  means no limit i
32870 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41  s enforced..** A
32880 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74  n attempt to set
32890 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72   a limit smaller
328a0 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f   than -1 is a no
328b0 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  -op..*/.i64 sqli
328c0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
328d0 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
328e0 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
328f0 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
32900 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
32910 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
32920 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
32930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
32940 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
32950 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Limit;.}../*.** 
32960 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
32970 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e   to the pPager->
32980 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65  pBackup variable
32990 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64  . The backup mod
329a0 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70  ule.** in backup
329b0 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65  .c maintains the
329c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
329d0 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20   variable. This 
329e0 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69  module.** uses i
329f0 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e  t opaquely as an
32a00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
32a10 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
32a20 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74  t() and.** sqlit
32a30 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29  e3BackupUpdate()
32a40 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65   only..*/.sqlite
32a50 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74  3_backup **sqlit
32a60 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72  e3PagerBackupPtr
32a70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32a80 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65  .  return &pPage
32a90 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23  r->pBackup;.}..#
32aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32ab0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.