/ Hex Artifact Content
Login

Artifact 2a5df21f1fc4acfa51815305892df13c7f90bc76:


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 33 32  : pager.c,v 1.32
0350: 37 20 32 30 30 37 2f 30 34 2f 31 33 20 30 32 3a  7 2007/04/13 02:
0360: 31 34 3a 33 30 20 64 72 68 20 45 78 70 20 24 0a  14:30 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61   */.  int nMaxPa
2f80: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f90: 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20    /* High water 
2fa0: 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f  mark of nPage */
2fb0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
2fe0: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
2ff0: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3000: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3030: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3040: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3050: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3070: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3080: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3090: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
30a0: 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20  8 *aInStmt;     
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30c0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
30d0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
30e0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
30f0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
3100: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3120: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
3130: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3140: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3160: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
3170: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
3180: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
3190: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
31a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a    OsFile *fd, *j
31c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
31f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
3200: 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  OsFile *stfd;   
3210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3230: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
3240: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
3250: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3260: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
3270: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
3280: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
3290: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c    PgHdr *pFirst,
32a0: 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a   *pLast;      /*
32b0: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   List of free pa
32c0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
32d0: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20  pFirstSynced;   
32e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72       /* First fr
32f0: 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48  ee page with PgH
3300: 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a  dr.needSync==0 *
3310: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
3340: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3350: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
3380: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
3390: 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  al */.  PgHdr *p
33a0: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
33b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
33c0: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a  ll dirty pages *
33d0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
33e0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
33f0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
3400: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
3410: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3420: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3440: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
3450: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
3460: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73  eader */.  i64 s
3470: 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20  tmtHdrOff;      
3480: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
34a0: 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74  ritten this stat
34b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73  ement */.  i64 s
34c0: 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20  tmtCksum;       
34d0: 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49         /* cksumI
34e0: 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65  nit when stateme
34f0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a  nt was started *
3500: 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a  /.  i64 stmtJSiz
3510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3520: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
3530: 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  al at stmt_begin
3540: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74  () */.  int sect
3550: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
3560: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
3570: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
3580: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69  g rollback */.#i
3590: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
35a0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
35b0: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
35c0: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
35d0: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
35e0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
35f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3600: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
3610: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
3620: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  if.  void (*xDes
3630: 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a  tructor)(DbPage*
3640: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
3650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3660: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
3670: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
3680: 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  iter)(DbPage*,in
3690: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
36a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
36b0: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
36c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36d0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
36e0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
36f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3700: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3710: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3720: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3730: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3740: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3750: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3760: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
3770: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3790: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
37a0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
37b0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
37d0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
37e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
37f0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
3800: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3810: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
3820: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3850: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3860: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3870: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
3880: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3890: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
38a0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
38b0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
38c0: 75 33 32 20 69 43 68 61 6e 67 65 43 6f 75 6e 74  u32 iChangeCount
38d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
38e0: 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  b change-counter
38f0: 20 66 6f 72 20 77 68 69 63 68 20 63 61 63 68 65   for which cache
3900: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a   is valid */.};.
3910: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3920: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
3930: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
3940: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
3950: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
3960: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
3970: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
3980: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
3990: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
39a0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
39b0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
39c0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
39d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
39e0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
39f0: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
3a00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3a10: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
3a20: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
3a30: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a40: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
3a50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
3a60: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
3a70: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
3a80: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a90: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
3aa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3ab0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3ac0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
3ad0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
3ae0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
3af0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3b00: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
3b10: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
3b20: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
3b30: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
3b40: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
3b50: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
3b60: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3b70: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3b80: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3b90: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3ba0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3bb0: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3bc0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
3bd0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
3be0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
3bf0: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
3c00: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3c10: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
3c20: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3c30: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3c40: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3c50: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3c60: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3c70: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3c80: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3c90: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3ca0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3cb0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3cc0: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
3cd0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
3ce0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
3cf0: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
3d00: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
3d10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
3d20: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3d30: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3d40: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3d50: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3d60: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3d70: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3d80: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3d90: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3da0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3db0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3dc0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
3dd0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3de0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
3df0: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
3e00: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
3e10: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
3e20: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3e30: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3e40: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3e50: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3e60: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3e70: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3e80: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3e90: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3ea0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3eb0: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3ec0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
3ed0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
3ee0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
3ef0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
3f00: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
3f10: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
3f20: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3f30: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3f40: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3f50: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3f60: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3f70: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3f80: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3f90: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3fa0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3fb0: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3fc0: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
3fd0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
3fe0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
3ff0: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
4000: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4010: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
4020: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
4030: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
4040: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
4050: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
4060: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
4070: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4080: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
4090: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
40a0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
40b0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
40c0: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
40d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
40e0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
40f0: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
4100: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4110: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
4120: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4130: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
4140: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
4150: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
4160: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4170: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4180: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
4190: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
41a0: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
41b0: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
41c0: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
41d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
41e0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
41f0: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
4200: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
4210: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
4220: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
4230: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
4240: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4250: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4260: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4270: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4280: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4290: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
42a0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
42b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
42c0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
42d0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
42e0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
42f0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4300: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
4310: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4320: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
4330: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
4340: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
4350: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4360: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4370: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4380: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4390: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
43a0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
43b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
43c0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
43d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
43e0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
43f0: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
4400: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
4410: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
4420: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
4430: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4440: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4450: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4460: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4470: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4480: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
4490: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
44a0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
44b0: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
44c0: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
44d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44e0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
44f0: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
4500: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
4510: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
4520: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
4530: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4540: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4550: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4560: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4570: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4580: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
4590: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
45a0: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
45b0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
45c0: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
45d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
4600: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
4610: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
4620: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
4630: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4640: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4650: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4660: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4670: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4680: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
4690: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
46a0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
46b0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
46c0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
46d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46e0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
46f0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4700: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4710: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4720: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4730: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4740: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4750: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4760: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4770: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
4780: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
4790: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
47a0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
47b0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
47c0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
47d0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
47e0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
47f0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4800: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
4810: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4820: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
4830: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
4840: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
4850: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
4860: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
4870: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
4880: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
4890: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
48a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
48b0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
48c0: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
48d0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
48e0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
48f0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4900: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
4910: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
4920: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
4930: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
4940: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
4950: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4960: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
4970: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
4980: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
4990: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
49a0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
49b0: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
49c0: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
49d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
49e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
49f0: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4a00: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4a10: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4a20: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4a30: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4a40: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4a50: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4a60: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4a70: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4a80: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4a90: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4aa0: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4ab0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4ac0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4ad0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4ae0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4af0: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4b00: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4b10: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4b20: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4b30: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4b40: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4b50: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4b60: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4b70: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4b80: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4b90: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4ba0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4bb0: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4bc0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4be0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4bf0: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4c00: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4c10: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c20: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
4c30: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
4c40: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
4c50: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
4c60: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
4c70: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
4c80: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4c90: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4ca0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4cb0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4cc0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4cd0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4ce0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4cf0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d00: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4d10: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4d20: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4d30: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4d40: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4d50: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4d60: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4d70: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4d80: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4d90: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4da0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4db0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4dc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4dd0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4de0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4df0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4e00: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4e10: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4e20: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4e30: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4e40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4e50: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
4e60: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
4e70: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
4e80: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
4e90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4ea0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4eb0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
4ec0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4ed0: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4ee0: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4ef0: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4f00: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4f10: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4f20: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4f30: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4f40: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4f50: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4f60: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4f70: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
4f80: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4f90: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4fa0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
4fb0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
4fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4fd0: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4fe0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4ff0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5000: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
5010: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
5020: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
5030: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
5040: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
5050: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
5060: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
5070: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
5080: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
5090: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74  2-bit integer at
50a0: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
50b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
50c0: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
50d0: 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e  page header 'p'.
50e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72  .*/.static u32 r
50f0: 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67  etrieve32bits(Pg
5100: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
5110: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
5120: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
5130: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
5140: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
5150: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
5160: 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32  return (ac[0]<<2
5170: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
5180: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
5190: 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ac[3];.}.../*.**
51a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
51b0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
51c0: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
51d0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
51e0: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
51f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5200: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
5210: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
5220: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
5230: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
5240: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
5250: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
5260: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
5270: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
5280: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
5290: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
52a0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
52b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
52c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
52d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
52e0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
52f0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
5300: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
5310: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
5320: 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73  ersistent. All s
5330: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
5340: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
5350: 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69  r.** will immedi
5360: 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
5370: 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
5380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5390: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
53a0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
53b0: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
53c0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
53d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
53e0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
53f0: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
5400: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
5410: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
5420: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
5430: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
5440: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
5450: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
5460: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
5470: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
5480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5490: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
54a0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
54b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
54c0: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
54d0: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
54e0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
54f0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
5500: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
5510: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
5520: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
5530: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
5540: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5550: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5560: 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72  TA(pPage);.  for
5570: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70  (i=0; i<pPage->p
5580: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
5590: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
55a0: 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61  = (hash+i)^pData
55b0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
55c0: 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n hash;.}../*.**
55d0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
55e0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
55f0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
5600: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
5610: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
5620: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
5630: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
5640: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5650: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5660: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5670: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5680: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5690: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
56a0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
56b0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
56c0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
56d0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
56e0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
56f0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
5700: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
5710: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
5720: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
5730: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5740: 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  e || MEMDB || pP
5750: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
5760: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
5770: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5780: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5790: 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  e.#define CHECK_
57a0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
57b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
57c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
57d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
57e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
57f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
5800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5810: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
5820: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
5830: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
5840: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5850: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5860: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5870: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
5880: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
5890: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
58a0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
58b0: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
58c0: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
58d0: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
58e0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
58f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5900: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
5910: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
5920: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
5930: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
5940: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5950: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
5960: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
5970: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
5980: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5990: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
59a0: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
59b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
59c0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
59d0: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
59e0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
59f0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
5a00: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5a10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5a20: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
5a30: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
5a40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5a50: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5a60: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5a70: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5a80: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
5a90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5aa0: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
5ab0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5ac0: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
5ad0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5ae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5af0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
5b00: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
5b10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5b20: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5b30: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5b40: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5b50: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
5b60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5b70: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5b80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5b90: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5ba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5bb0: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5bc0: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5bd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5be0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
5bf0: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
5c00: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
5c10: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
5c20: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
5c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5c40: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
5c50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5c60: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
5c70: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5c80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5c90: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5ca0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5cb0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
5cc0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
5cd0: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
5ce0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
5cf0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5d00: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
5d10: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
5d20: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
5d30: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
5d40: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5d50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5d60: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5d70: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5d80: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5d90: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5da0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5db0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5dc0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5dd0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5de0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
5df0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
5e00: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
5e10: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
5e20: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
5e30: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5e40: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5e50: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
5e60: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5e70: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5e80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
5e90: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
5ea0: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5ec0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5ed0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
5ee0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
5ef0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5f00: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5f10: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5f20: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5f30: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5f40: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5f50: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5f60: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5f70: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5f80: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5f90: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5fa0: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5fb0: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5fc0: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6010: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6030: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6050: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
6080: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
6090: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
60a0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
60b0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
60c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
60d0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
60e0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
60f0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
6100: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
6110: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
6120: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
6130: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
6140: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6150: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
6160: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
6170: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
6180: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
6190: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
61a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
61b0: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
61c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
61d0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
61e0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
61f0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
6200: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6210: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6220: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
6230: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
6240: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
6250: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
6260: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
6270: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
6280: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
6290: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
62a0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
62b0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
62c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
62d0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
62e0: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
62f0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
6300: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
6310: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
6320: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
6330: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
6340: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
6350: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
6360: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
6370: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
6380: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
6390: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
63a0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
63b0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
63c0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
63d0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
63e0: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
63f0: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
6400: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
6410: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
6420: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
6430: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
6440: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
6450: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6460: 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64  r){.  char zHead
6470: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6480: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20  alMagic)+16];.  
6490: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
64a0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
64b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
64c0: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
64d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
64e0: 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  Off;.  }..  rc =
64f0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6500: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
6510: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6520: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
6530: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
6540: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
6550: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6560: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
6570: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
6580: 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20   FIX ME: .  **. 
6590: 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72   ** Possibly for
65a0: 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20   a pager not in 
65b0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  no-sync mode, th
65c0: 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20  e journal magic 
65d0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20  should not.  ** 
65e0: 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c  be written until
65f0: 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20   nRec is filled 
6600: 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65  in as part of ne
6610: 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  xt syncJournal()
6620: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  . .  **.  ** Act
6630: 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20  ually maybe the 
6640: 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65  whole journal he
6650: 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64  ader should be d
6660: 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61  elayed until tha
6670: 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68  t.  ** point. Th
6680: 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a  ink about this..
6690: 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48    */.  memcpy(zH
66a0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
66b0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
66c0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
66d0: 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c  /* The nRec Fiel
66e0: 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f  d. 0xFFFFFFFF fo
66f0: 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61  r no-sync journa
6700: 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ls. */.  put32bi
6710: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6720: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6730: 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  )], pPager->noSy
6740: 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  nc ? 0xffffffff 
6750: 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72  : 0);.  /* The r
6760: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
6770: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
6780: 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d  .  sqlite3Random
6790: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
67a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
67b0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
67c0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
67d0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
67e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
67f0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
6800: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
6810: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
6820: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
6830: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6840: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6850: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
6860: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  >dbSize);.  /* T
6870: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
6880: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
6890: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
68a0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
68b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
68c0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
68d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
68e0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
68f0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
6900: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
6910: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65  journalHdr, size
6920: 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20  of(zHeader))).  
6930: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6940: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
6950: 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
6960: 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f  (zHeader));..  /
6970: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
6980: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
6990: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
69a0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
69b0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
69c0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
69d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
69e0: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
69f0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6a10: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41     IOTRACE(("JTA
6a20: 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  IL %p %lld\n", p
6a30: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
6a40: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20  ournalOff-1)).  
6a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6a60: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
6a70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
6a80: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28  lOff-1);.    if(
6a90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6aa0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6ab0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
6ac0: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
6ad0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
6ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6af0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
6b00: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
6b10: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
6b20: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
6b30: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
6b40: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6b50: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
6b60: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
6b70: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
6b80: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
6b90: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
6ba0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
6bb0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
6bc0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
6bd0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
6be0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
6bf0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
6c00: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
6c10: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
6c20: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
6c30: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
6c40: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
6c50: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
6c60: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
6c70: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
6c80: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
6c90: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
6ca0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
6cc0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6cd0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
6ce0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
6cf0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6d00: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
6d10: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
6d20: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
6d30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
6d40: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
6d50: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
6d60: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
6d70: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
6d80: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
6d90: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
6da0: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
6db0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
6dc0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
6dd0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6de0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
6df0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
6e00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
6e10: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
6e20: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6e30: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
6e40: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
6e50: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
6e60: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
6e70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6e80: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
6e90: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
6ea0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
6eb0: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
6ec0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6ed0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
6ee0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
6ef0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6f00: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
6f10: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
6f20: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6f40: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6f50: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
6f60: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
6f70: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6f80: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
6f90: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
6fa0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
6fb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6fc0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
6fd0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6fe0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6ff0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7000: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7010: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
7020: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7030: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7040: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  s(pPager->jfd, &
7050: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
7060: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
7070: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
7080: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7090: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a  ger->jfd, pDbSiz
70a0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
70b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
70c0: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
70d0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
70e0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
70f0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
7100: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
7110: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
7120: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
7130: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
7140: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
7150: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
7160: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
7170: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
7180: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
7190: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
71a0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
71b0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
71c0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
71d0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
71e0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
71f0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
7200: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
7210: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7220: 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  fd, (u32 *)&pPag
7230: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
7240: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
7250: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
7260: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7270: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7280: 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
7290: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
72a0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
72b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
72c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
72d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
72e0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
72f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
7300: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7310: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
7320: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
7330: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
7340: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
7350: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
7360: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
7370: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
7380: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
7390: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
73a0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
73b0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
73c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
73d0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
73e0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
73f0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
7400: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
7410: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
7420: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
7430: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
7440: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
7450: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
7460: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7470: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
7480: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
7490: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
74a0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
74b0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
74c0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
74d0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
74e0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
74f0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
7500: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
7510: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
7520: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
7530: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
7540: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
7550: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
7560: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
7570: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
7580: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
7590: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
75a0: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
75b0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
75c0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
75d0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
75e0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
75f0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
7600: 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61  cksum = 0;.  cha
7610: 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a  r zBuf[sizeof(aJ
7620: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34  ournalMagic)+2*4
7630: 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ];..  if( !zMast
7640: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
7650: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
7660: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
7670: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
7680: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
7690: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
76a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
76b0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
76c0: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
76d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
76e0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
76f0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
7700: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
7710: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
7720: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
7730: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
7740: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
7750: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
7760: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
7770: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
7780: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
7790: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
77a0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
77b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a  {.    rc = seekJ
77c0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
77d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
77e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
77f0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
7800: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
7810: 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72  = (len+20);..  r
7820: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
7830: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47  pPager->jfd, PAG
7840: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
7850: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
7860: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7870: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
7880: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7890: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
78a0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
78b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
78c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74  eturn rc;..  put
78d0: 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e  32bits(zBuf, len
78e0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
78f0: 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b  zBuf[4], cksum);
7900: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
7910: 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  8], aJournalMagi
7920: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
7930: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20  alMagic));.  rc 
7940: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7950: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42  (pPager->jfd, zB
7960: 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f  uf, 8+sizeof(aJo
7970: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
7980: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
7990: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
79a0: 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nc;.  return rc;
79b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
79c0: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
79d0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
79e0: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
79f0: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
7a00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
7a10: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
7a20: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
7a30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
7a40: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
7a50: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
7a60: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
7a70: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
7a80: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
7a90: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
7aa0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
7ab0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
7ac0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
7ad0: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
7ae0: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
7af0: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
7b00: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
7b10: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
7b20: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
7b30: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
7b40: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
7b50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7b60: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
7b70: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
7b80: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
7b90: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
7ba0: 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b  assert( MEMDB );
7bb0: 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69  .  if( !pHist->i
7bc0: 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  nStmt ){.    ass
7bd0: 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65  ert( pHist->pPre
7be0: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73  vStmt==0 && pHis
7bf0: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  t->pNextStmt==0 
7c00: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
7c10: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
7c20: 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28    PGHDR_TO_HIST(
7c30: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70  pPager->pStmt, p
7c40: 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d  Pager)->pPrevStm
7c50: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
7c60: 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53     pHist->pNextS
7c70: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
7c80: 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  tmt;.    pPager-
7c90: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
7ca0: 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
7cb0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
7cc0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
7cd0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
7ce0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
7cf0: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
7d00: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
7d10: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
7d20: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
7d30: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
7d40: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
7d50: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
7d60: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
7d70: 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  p;.  if( pPager-
7d80: 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75  >aHash==0 ) retu
7d90: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67  rn 0;.  p = pPag
7da0: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26  er->aHash[pgno &
7db0: 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
7dc0: 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  1)];.  while( p 
7dd0: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
7de0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
7df0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
7e00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7e10: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
7e20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
7e30: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7e40: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
7e50: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
7e60: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
7e70: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  eMode ){.    if(
7e80: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
7e90: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7ea0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
7eb0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61  LOCK);.      pPa
7ec0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
7ed0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
7ee0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
7ef0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20  pPager)).    }. 
7f00: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
7f10: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
7f20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
7f30: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
7f40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ;.  }.}../*.** E
7f50: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
7f60: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
7f70: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
7f80: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
7f90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
7fa0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
7fb0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
7fc0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a  already entered.
7fd0: 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  ** the error-sta
7fe0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
7ff0: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
8000: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
8010: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72  *p){.  if( p->er
8020: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
8030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
8040: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
8050: 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  ED || p->journal
8060: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Open==0 );.  if(
8070: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
8080: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
80a0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20  lback(p);.  }.  
80b0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b  pager_unlock(p);
80c0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
80d0: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75  rCode || !p->jou
80e0: 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e  rnalOpen || (p->
80f0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21  exclusiveMode&&!
8100: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29  p->journalOff) )
8110: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
8120: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74  rrCode || !p->st
8130: 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63  mtOpen || p->exc
8140: 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a  lusiveMode );.}.
8150: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
8160: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
8170: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
8180: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
8190: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
81a0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
81b0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
81c0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
81d0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
81e0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
81f0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
8200: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
8210: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
8220: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
8230: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
8240: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
8250: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
8260: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
8270: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
8280: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
8290: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
82a0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
82b0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
82c0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
82d0: 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  xt){.    IOTRACE
82e0: 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
82f0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
8300: 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47  >pgno));.    PAG
8310: 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
8320: 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
8330: 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  nt);.    pNext =
8340: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
8350: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
8360: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
8370: 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
8380: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
8390: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
83a0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
83b0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
83c0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
83d0: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
83e0: 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->nHash = 0;.  
83f0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
8400: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
8410: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
8420: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
8430: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8440: 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ref = 0;.}../*.*
8450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
8460: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
8470: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
8480: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
8490: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
84a0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
84b0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
84c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
84d0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
84e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
84f0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
8500: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
8510: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
8520: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
8530: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
8540: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
8550: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
8560: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
8570: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
8580: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
8590: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
85a0: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
85b0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
85c0: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
85d0: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
85e0: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
85f0: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
8600: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
8610: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
8620: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
8630: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
8640: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
8650: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
8660: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
8670: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
8680: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
8690: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
86b0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
86c0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
86d0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
86e0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
86f0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
8700: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
8710: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
8720: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
8730: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
8740: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
8750: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
8760: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
8770: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
8780: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8790: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
87a0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
87b0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
87c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
87d0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
87e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
87f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
8800: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
8810: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
8820: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
8830: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
8840: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
8850: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8860: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
8870: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
8880: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
8890: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
88a0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
88b0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
88c0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
88d0: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
88e0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
88f0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8900: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
8910: 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  {;.      sqlite3
8920: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
8930: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  fd, 0);.      pP
8940: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8950: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8960: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
8970: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
8980: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8990: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
89a0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
89b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
89c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
89d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
89e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
89f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
8a00: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
8a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
8a30: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8a40: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
8a50: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
8a60: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
8a70: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8a80: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
8a90: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
8aa0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8ab0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
8ac0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
8ad0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
8ae0: 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f     pPg->alwaysRo
8af0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64  llback = 0;.#ifd
8b00: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
8b10: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
8b20: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
8b30: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
8b40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
8b50: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
8b60: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
8b70: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
8b80: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
8b90: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
8ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8bb0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
8bc0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8bd0: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
8be0: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
8bf0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
8c00: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
8c10: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8c20: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
8c30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
8c40: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
8c50: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
8c60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8c70: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
8c80: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
8c90: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
8ca0: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
8cb0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
8cc0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
8cd0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
8ce0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
8cf0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8d00: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8d10: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
8d20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8d30: 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
8d40: 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  First;.  pPager-
8d50: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
8d60: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
8d70: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
8d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8d90: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
8da0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
8db0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
8dc0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
8dd0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
8de0: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
8df0: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
8e00: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
8e10: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
8e20: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
8e30: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
8e40: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
8e50: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
8e60: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
8e70: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
8e80: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
8e90: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
8ea0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
8eb0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
8ec0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
8ed0: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
8ee0: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
8ef0: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
8f00: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
8f10: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
8f20: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
8f30: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
8f40: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
8f50: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
8f60: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
8f70: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
8f80: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
8f90: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
8fa0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
8fb0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
8fc0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
8fd0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
8fe0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
8ff0: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
9000: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
9010: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
9020: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
9030: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
9040: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
9050: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
9060: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
9070: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
9080: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
9090: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
90a0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
90b0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
90c0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
90d0: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
90e0: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
90f0: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
9100: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
9110: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
9120: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
9130: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
9140: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
9150: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
9160: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
9170: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
9180: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
9190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
91a0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
91b0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
91c0: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
91d0: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
91e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
91f0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
9200: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
9210: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
9220: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
9230: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
9240: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9250: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  cksum;.}../* For
9260: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
9270: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
9280: 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a  makeClean(PgHdr*
9290: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  );../*.** Read a
92a0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
92b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
92c0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
92d0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
92e0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
92f0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
9300: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
9310: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
9320: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
9330: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
9340: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
9350: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
9360: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9370: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
9380: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
9390: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
93a0: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
93b0: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
93c0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
93d0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
93e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
93f0: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
9400: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
9410: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
9440: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
9450: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
9460: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
9470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9480: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
9490: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
94a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
94d0: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
94e0: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
94f0: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
9500: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
9510: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
9520: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
9530: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
9540: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
9550: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
9560: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
9570: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9580: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
9590: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
95a0: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
95b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
95c0: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
95d0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
95e0: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
95f0: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
9600: 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  );..  rc = read3
9610: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
9620: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9630: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
9640: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
9650: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
9660: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9670: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
9680: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
9690: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
96a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
96b0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
96c0: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
96d0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
96e0: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
96f0: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
9700: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
9710: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
9720: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
9730: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
9740: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
9750: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
9760: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
9770: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
9780: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
9790: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
97a0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
97b0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
97c0: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
97d0: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
97e0: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
97f0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
9800: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
9810: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9820: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
9830: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9840: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
9850: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
9860: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
9870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9880: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
9890: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
98a0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
98b0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
98c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
98d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
98e0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
98f0: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
9900: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
9910: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
9920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9930: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9940: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9950: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
9960: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
9970: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9980: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
9990: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
99a0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
99b0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
99c0: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
99d0: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
99e0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
99f0: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
9a00: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
9a10: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
9a20: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
9a30: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
9a40: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
9a50: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
9a60: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
9a70: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
9a80: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
9a90: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
9aa0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
9ab0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
9ac0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
9ad0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
9ae0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
9af0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
9b00: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
9b10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
9b20: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
9b30: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
9b40: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
9b50: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
9b60: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
9b70: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
9b80: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
9b90: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
9ba0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
9bb0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
9bc0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
9bd0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
9be0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
9bf0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
9c00: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
9c10: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
9c20: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
9c30: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
9c40: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
9c50: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
9c60: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
9c70: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
9c80: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
9c90: 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  are in the main 
9ca0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
9cb0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
9cc0: 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c  e, if a full ROL
9cd0: 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74  LBACK occurs aft
9ce0: 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  er the statement
9cf0: 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  .  ** rollback t
9d00: 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b  he full ROLLBACK
9d10: 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72   will not restor
9d20: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74  e the page to it
9d30: 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
9d40: 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f  content.  Two co
9d50: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
9d60: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
9d70: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
9d80: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20  ase.  ** files. 
9d90: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
9da0: 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e   must be locked.
9db0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
9dc0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  at the original.
9dd0: 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e    ** page conten
9de0: 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  t is in the main
9df0: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
9e00: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
9e10: 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20   is not in.  ** 
9e20: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74  cache or else it
9e30: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
9e40: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a  edSync==0..  */.
9e50: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
9e60: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
9e70: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
9e80: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9e90: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
9ea0: 70 50 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45  pPg!=0 );.  PAGE
9eb0: 52 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43  RTRACE3("PLAYBAC
9ec0: 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  K %d page %d\n",
9ed0: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
9ee0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
9ef0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
9f00: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
9f10: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
9f20: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b  >needSync==0) ){
9f30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9f40: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
9f50: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
9f60: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
9f70: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ze);.    if( rc=
9f80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9f90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9fa0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9fb0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
9fc0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9fd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20    }.    if( pPg 
9fe0: 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  ){.      makeCle
9ff0: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
a000: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
a010: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
a020: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
a030: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
a040: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
a050: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
a060: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
a070: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
a080: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
a090: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
a0a0: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
a0b0: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
a0c0: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
a0d0: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
a0e0: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
a0f0: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
a100: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
a110: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
a120: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
a130: 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
a140: 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
a150: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
a160: 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  ta;.    /* asser
a170: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
a180: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
a190: 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  ); */.    pData 
a1a0: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
a1b0: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
a1c0: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
a1d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a1e0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
a1f0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
a200: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
a210: 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67  initer(pPg, pPag
a220: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a230: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
a240: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
a250: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
a260: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
a270: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
a280: 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
a290: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
a2a0: 6e 6f 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20  no, 3);..    /* 
a2b0: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
a2c0: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
a2d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
a2e0: 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74  ger.iChangeCount
a2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
a300: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==1 ){.      pPa
a310: 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e  ger->iChangeCoun
a320: 74 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  t = retrieve32bi
a330: 74 73 28 70 50 67 2c 20 32 34 29 3b 0a 20 20 20  ts(pPg, 24);.   
a340: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a350: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
a360: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
a370: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
a380: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a390: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
a3a0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
a3b0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
a3c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a3d0: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
a3e0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
a3f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
a400: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
a410: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
a420: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
a430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
a440: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
a450: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
a460: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a470: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
a480: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
a490: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  hild journals..*
a4a0: 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d  * To tell if a m
a4b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
a4c0: 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68  n be deleted, ch
a4d0: 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74  eck to each of t
a4e0: 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20  he.** children. 
a4f0: 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   If all children
a500: 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73   are either miss
a510: 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65  ing or do not re
a520: 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66  fer to.** a diff
a530: 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75  erent master jou
a540: 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  rnal, then this 
a550: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
a560: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  an be deleted..*
a570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a580: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e  er_delmaster(con
a590: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
a5a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
a5b0: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
a5c0: 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61   0;.  OsFile *ma
a5d0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ster = 0;.  char
a5e0: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
a5f0: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
a600: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
a610: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
a620: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
a630: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
a640: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
a650: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
a660: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
a670: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
a680: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
a690: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
a6a0: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
a6b0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
a6c0: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
a6d0: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
a6e0: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
a6f0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
a700: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
a710: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
a720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
a730: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 61  =SQLITE_OK || ma
a740: 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20 72 63  ster );.  if( rc
a750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a760: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a770: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
a780: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
a790: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61  te3OsFileSize(ma
a7a0: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
a7b0: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
a7c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a7d0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a7e0: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
a7f0: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
a800: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
a810: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
a820: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
a830: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
a840: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
a850: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
a860: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
a870: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
a880: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
a890: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
a8a0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
a8b0: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
a8c0: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
a8d0: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
a8e0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
a8f0: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
a900: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
a910: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a920: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a930: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
a940: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a950: 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d  sRead(master, zM
a960: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
a970: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
a980: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a990: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
a9a0: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
a9b0: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
a9c0: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
a9d0: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
a9e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
a9f0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
aa00: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
aa10: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
aa20: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
aa30: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
aa40: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
aa50: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
aa60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
aa70: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
aa80: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
aa90: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
aaa0: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
aab0: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
aac0: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
aad0: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
aae0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aaf0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
ab00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
ab10: 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b  le *journal = 0;
ab20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
ab30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ab40: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
ab50: 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a  nly(zJournal, &j
ab60: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
ab70: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ab80: 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72 6e 61  ITE_OK || journa
ab90: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
aba0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
abb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
abc0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
abd0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
abe0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
abf0: 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61  erJournal(journa
ac00: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
ac10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac20: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
ac30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ac40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ac50: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
ac60: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
ac70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
ac80: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
ac90: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
aca0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
acb0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
acc0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
acd0: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
ace0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
acf0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
ad00: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
ad10: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ad20: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
ad30: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
ad40: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
ad50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ad60: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
ad70: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
ad80: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
ad90: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
ada0: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
adb0: 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f  er);..delmaster_
adc0: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
add0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
ade0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
adf0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
ae00: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
ae10: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
ae20: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
ae30: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
ae40: 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  n rc;.}...static
ae50: 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e   void pager_trun
ae60: 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72  cate_cache(Pager
ae70: 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a   *pPager);../*.*
ae80: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
ae90: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
aea0: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
aeb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
aec0: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
aed0: 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74   Also truncate t
aee0: 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73  he cached repres
aef0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
af00: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
af10: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
af20: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
af30: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
af40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
af50: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
af60: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
af70: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
af80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
af90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
afa0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
afb0: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
afc0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
afd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
afe0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
aff0: 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
b000: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
b010: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
b020: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b030: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
b040: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
b050: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
b060: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
b070: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
b080: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
b090: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
b0a0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
b0b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b0c0: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
b0d0: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
b0e0: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
b0f0: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
b100: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
b110: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
b120: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
b130: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
b140: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
b150: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
b160: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
b170: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
b180: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
b190: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
b1a0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
b1b0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
b1c0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
b1d0: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
b1e0: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
b1f0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b200: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
b210: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
b220: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
b230: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
b240: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
b250: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b260: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b270: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
b280: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
b290: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
b2a0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
b2b0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
b2c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b2d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
b2e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b2f0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
b300: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
b310: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
b320: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
b330: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
b340: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
b350: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
b360: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
b370: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
b380: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
b390: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
b3a0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
b3b0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
b3c0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
b3d0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
b3e0: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
b3f0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
b400: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
b410: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
b420: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
b430: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
b440: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
b450: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
b460: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
b470: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
b480: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
b490: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
b4a0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
b4b0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
b4c0: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
b4d0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
b4e0: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
b4f0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
b500: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
b510: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
b520: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
b530: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
b540: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
b550: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b560: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b570: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b580: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b590: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b5a0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b5b0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
b5c0: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
b5d0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
b5e0: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
b5f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
b600: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
b610: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
b620: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
b630: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
b640: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b650: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
b660: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
b670: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
b680: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
b690: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
b6a0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
b6b0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
b6c0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b6d0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
b6e0: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
b6f0: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
b700: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
b710: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
b720: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
b730: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
b740: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
b750: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
b760: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b770: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
b780: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
b790: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
b7a0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
b7b0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
b7c0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
b7d0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b7e0: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
b7f0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
b800: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
b810: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
b820: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
b830: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
b840: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
b850: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
b860: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
b870: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
b880: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
b890: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
b8a0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
b8b0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
b8c0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
b8d0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
b8e0: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
b8f0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
b900: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
b910: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
b920: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
b930: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
b940: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b950: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b960: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b970: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b980: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b990: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b9a0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b9b0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
b9c0: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
b9d0: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
b9e0: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
b9f0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
ba00: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
ba10: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
ba20: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
ba30: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
ba40: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
ba50: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
ba60: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
ba70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
ba80: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
ba90: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
baa0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
bab0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
bac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bad0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
bae0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
baf0: 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73   isHot){.  i64 s
bb00: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
bb10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bb20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bb30: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
bb40: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
bb50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bb60: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
bb70: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
bb80: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
bb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bba0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
bbb0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
bbc0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bbd0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
bbe0: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
bbf0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
bc00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
bc10: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
bc20: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
bc30: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
bc40: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
bc50: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
bc60: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
bc70: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
bc80: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
bc90: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
bca0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
bcb0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
bcc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
bcd0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
bce0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bcf0: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
bd00: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
bd10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
bd20: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
bd30: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
bd50: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
bd60: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
bd70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
bd80: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
bd90: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
bda0: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
bdb0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
bdc0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
bdd0: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
bde0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
bdf0: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
be00: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
be10: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
be20: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
be30: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
be40: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
be50: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
be60: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
be70: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
be80: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
be90: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
bea0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
beb0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
bec0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
bed0: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
bee0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bef0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
bf00: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
bf10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
bf20: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
bf30: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
bf40: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
bf50: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
bf60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
bf70: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
bf80: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
bf90: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
bfa0: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
bfb0: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
bfc0: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
bfd0: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
bfe0: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
bff0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
c000: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
c010: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
c020: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
c030: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
c040: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
c050: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
c060: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
c070: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
c080: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
c090: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
c0a0: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
c0b0: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
c0c0: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
c0d0: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
c0e0: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
c0f0: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c100: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
c110: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
c120: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
c130: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
c140: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
c150: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
c160: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c170: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
c180: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c190: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c1a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c1c0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c1d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c1e0: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
c1f0: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
c200: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
c210: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c220: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
c230: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
c240: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
c250: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c260: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
c270: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c280: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
c290: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
c2a0: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
c2b0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
c2c0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
c2d0: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
c2e0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
c2f0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
c300: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
c310: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c320: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
c330: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c340: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
c350: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
c360: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
c370: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
c380: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c390: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c3a0: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
c3b0: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
c3c0: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
c3d0: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
c3e0: 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73  process. In this
c3f0: 20 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f   case the rest o
c400: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c410: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20  le consists of. 
c420: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64     ** journalled
c430: 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73   copies of pages
c440: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
c450: 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20   read back into 
c460: 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  the cache..    *
c470: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
c480: 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20  0 && !isHot ){. 
c490: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c4a0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
c4b0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
c4c0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c4d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c4e0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
c4f0: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
c500: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c510: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
c520: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c530: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
c540: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
c550: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
c560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c570: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
c580: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
c590: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
c5a0: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
c5b0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
c5c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c5d0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
c5e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
c5f0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
c600: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
c610: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
c620: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c630: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
c640: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
c650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c660: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
c670: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
c680: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
c690: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
c6a0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
c6b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c6c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
c6d0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
c6e0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c6f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c700: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c710: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
c720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c730: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c740: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
c750: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c760: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c770: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
c780: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
c790: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
c7a0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
c7b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c7c0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
c7d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
c7e0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
c7f0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f  zMaster ){.    /
c800: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
c810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c820: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
c830: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
c840: 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
c850: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
c860: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
c870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c880: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c8a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c8b0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
c8c0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
c8d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c8e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
c8f0: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
c900: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
c910: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
c920: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
c930: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
c940: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
c950: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
c960: 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
c970: 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
c980: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c990: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c9a0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c9b0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c9c0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
c9d0: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
c9e0: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
c9f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ca00: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
ca10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ca20: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
ca30: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
ca40: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
ca50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
ca60: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
ca70: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
ca80: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
ca90: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
caa0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
cab0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
cac0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
cad0: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
cae0: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
caf0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
cb00: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
cb10: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
cb20: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
cb30: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
cb40: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
cb50: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
cb60: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
cb70: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
cb80: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
cb90: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
cba0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
cbb0: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
cbc0: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
cbd0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
cbe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
cbf0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
cc00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
cc10: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cc30: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
cc40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
cc50: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
cc60: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
cc70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cc80: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
cc90: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
cca0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ccb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ccc0: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
ccd0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
cce0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
ccf0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
cd00: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
cd10: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
cd20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
cd30: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
cd40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
cd50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
cd60: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
cd70: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
cd80: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
cd90: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
cda0: 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
cdb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
cdc0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
cdd0: 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
cde0: 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
cdf0: 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
ce00: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
ce10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
ce20: 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
ce30: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
ce40: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
ce50: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
ce60: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
ce70: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
ce80: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
ce90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
cea0: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
ceb0: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
cec0: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
ced0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
cee0: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
cef0: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
cf00: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
cf10: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
cf20: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
cf30: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
cf40: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
cf50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
cf60: 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
cf70: 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
cf80: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
cf90: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
cfa0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cfb0: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
cfc0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
cfd0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
cfe0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
cff0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
d000: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
d010: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
d020: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
d030: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
d040: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
d050: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d060: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
d070: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d080: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
d090: 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
d0a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
d0b0: 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
d0c0: 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
d0d0: 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
d0e0: 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
d0f0: 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
d100: 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
d110: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
d120: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
d130: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
d140: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d150: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d160: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d170: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
d180: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d190: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d1a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d1b0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d1c0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d1d0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
d1e0: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
d1f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d200: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
d210: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
d220: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
d230: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d240: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
d250: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
d260: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
d270: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
d280: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
d290: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
d2a0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
d2b0: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
d2c0: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
d2d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
d2e0: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
d2f0: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
d300: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
d310: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
d320: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
d330: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
d340: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
d350: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
d360: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
d370: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
d380: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
d390: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
d3a0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
d3b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d3c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d3d0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
d3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d3f0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d400: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
d410: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
d420: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
d430: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68  ->journalOff < h
d450: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20  drOff ){.    rc 
d460: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d470: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d480: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
d490: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d4a0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d4b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d4c0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d4d0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d4e0: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
d4f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d500: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
d510: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
d520: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d530: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
d540: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
d550: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
d560: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
d570: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
d580: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
d590: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d5a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d5b0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d5c0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
d5d0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d5e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
d5f0: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
d600: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
d610: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d620: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
d630: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
d640: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
d650: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
d660: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d670: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
d680: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d690: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d6a0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
d6b0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  fd, 1);.      as
d6c0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d6d0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
d6e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d6f0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d700: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d710: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
d720: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d730: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
d740: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
d750: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
d760: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d770: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
d780: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
d790: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
d7a0: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
d7b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
d7c0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
d7d0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
d7e0: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
d7f0: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
d800: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
d810: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
d820: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d830: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
d840: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
d850: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d860: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65   mxPage;.  }else
d870: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d880: 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  Page = 10;.  }.}
d890: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
d8a0: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
d8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
d8c0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
d8d0: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
d8e0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
d8f0: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
d900: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
d910: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
d920: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
d930: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
d940: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
d950: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
d960: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
d970: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
d980: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
d990: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
d9a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
d9b0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
d9c0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
d9d0: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
d9e0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
d9f0: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
da00: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
da10: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
da20: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
da30: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
da40: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
da50: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
da60: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
da70: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
da80: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
da90: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
daa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
dab0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
dac0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
dad0: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
dae0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
daf0: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
db00: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
db10: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
db20: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
db30: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
db40: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
db50: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
db60: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
db70: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
db80: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
db90: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
dbb0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
dbc0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
dbd0: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
dbe0: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
dbf0: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
dc00: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
dc10: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
dc20: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
dc30: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
dc40: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
dc50: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
dc60: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
dc70: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
dc80: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
dc90: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
dca0: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
dcc0: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
dcd0: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
dce0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
dcf0: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
dd00: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
dd10: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
dd20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
dd30: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
dd40: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
dd50: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
dd60: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
dd70: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
dd80: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
dd90: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
dda0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
ddb0: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
ddc0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
ddd0: 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
dde0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
ddf0: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73  vel, int full_fs
de00: 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
de10: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
de20: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
de30: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
de40: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
de50: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
de60: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
de70: 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
de80: 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20   = full_fsync;. 
de90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
dea0: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
deb0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
dec0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
ded0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
dee0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
def0: 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
df00: 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
df10: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
df20: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
df30: 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
df40: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
df50: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
df60: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
df70: 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
df80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
df90: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
dfa0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
dfb0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
dfc0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
dfd0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
dfe0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
dff0: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
e000: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e010: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
e020: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
e030: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
e040: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
e050: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
e060: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
e070: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
e080: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
e090: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
e0a0: 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
e0b0: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
e0c0: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
e0d0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
e0e0: 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50  File[SQLITE_TEMP
e0f0: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66  NAME_SIZE];..#if
e100: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
e110: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
e120: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
e130: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
e140: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
e150: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64  ly */.#endif.  d
e160: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
e170: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
e180: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
e190: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e1a0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
e1b0: 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a  zFile, pFd, 1);.
e1c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e1d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70 46  SQLITE_OK || *pF
e1e0: 64 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63  d );.  }while( c
e1f0: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
e200: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
e210: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
e220: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e230: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e240: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
e250: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
e260: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
e270: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
e280: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
e290: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
e2a0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
e2b0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
e2c0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
e2d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
e2e0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
e2f0: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
e300: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
e310: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
e320: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
e330: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
e340: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
e350: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
e360: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
e370: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
e380: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
e390: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
e3a0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
e3b0: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
e3c0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
e3d0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
e3e0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e3f0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
e400: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
e410: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
e420: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
e430: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
e440: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
e450: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
e460: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
e470: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
e480: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
e490: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
e4a0: 72 4f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  rOpen(.  Pager *
e4b0: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
e4c0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
e4d0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
e4e0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
e4f0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
e500: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
e510: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e520: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
e530: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
e540: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
e550: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
e560: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
e570: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
e580: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
e590: 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
e5a0: 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
e5b0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
e5c0: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  Pager = 0;.  cha
e5d0: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
e5e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
e5f0: 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  Len;  /* Compile
e600: 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73  r is wrong. This
e610: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
e620: 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73  alized before us
e630: 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66  e */.  OsFile *f
e640: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  d = 0;.  int rc 
e650: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e660: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
e670: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
e680: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
e690: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
e6a0: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
e6b0: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e6c0: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
e6d0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
e6e0: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
e6f0: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
e700: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
e710: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
e720: 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66  ME_SIZE];.#ifdef
e730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
e740: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
e750: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
e760: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
e770: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e780: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
e790: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
e7a0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
e7b0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e7c0: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
e7d0: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
e7e0: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
e7f0: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
e800: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
e810: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
e820: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
e830: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
e840: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e850: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
e860: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
e870: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
e880: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
e890: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
e8a0: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
e8b0: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
e8c0: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
e8d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
e8e0: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
e8f0: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
e900: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
e910: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
e920: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
e930: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 65 20  #endif..  /* We 
e940: 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20  used to test if 
e950: 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20 61 6c 72  malloc() had alr
e960: 65 61 64 79 20 66 61 69 6c 65 64 20 62 65 66 6f  eady failed befo
e970: 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 0a  re proceeding. .
e980: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 77 61 79    ** But the way
e990: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
e9a0: 73 20 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65  s used in SQLite
e9b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 63 61 6e 20   means that can 
e9c0: 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61 70 70 65  never.  ** happe
e9d0: 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  n. Furthermore, 
e9e0: 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63 2d 66 61  if the malloc-fa
e9f0: 69 6c 65 64 20 66 6c 61 67 20 69 73 20 61 6c 72  iled flag is alr
ea00: 65 61 64 79 20 73 65 74 2c 20 0a 20 20 2a 2a 20  eady set, .  ** 
ea10: 65 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  either the call 
ea20: 74 6f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28  to sqliteStrDup(
ea30: 29 20 6f 72 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ) or sqliteMallo
ea40: 63 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 0a 20  c() below will. 
ea50: 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72 74 6c 79   ** fail shortly
ea60: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
ea70: 4d 20 72 65 74 75 72 6e 65 64 20 61 6e 79 77 61  M returned anywa
ea80: 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67  y..  */.  *ppPag
ea90: 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70  er = 0;..  /* Op
eaa0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
eab0: 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50  e and set zFullP
eac0: 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74  athname to point
ead0: 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a   at malloc()ed .
eae0: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74    ** memory cont
eaf0: 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c  aining the compl
eb00: 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e  ete filename (i.
eb10: 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e. including the
eb20: 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a   directory)..  *
eb30: 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
eb40: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
eb50: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
eb60: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
eb70: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
eb80: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
eb90: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
eba0: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
ebb0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
ebc0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
ebd0: 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ("");.    }else.
ebe0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
ebf0: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
ec00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ec10: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
ec20: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
ec30: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
ec40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ec50: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
ec60: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
ec70: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
ec80: 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  y);.        asse
ec90: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
eca0: 4b 20 7c 7c 20 66 64 20 29 3b 0a 20 20 20 20 20  K || fd );.     
ecb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
ecc0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ecd0: 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
ece0: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
ecf0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
ed00: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46 69 6c  zTemp);.    zFil
ed10: 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20  ename = zTemp;. 
ed20: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
ed30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ed40: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
ed50: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
ed60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ed70: 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
ed80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ed90: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  * Allocate the P
eda0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 20  ager structure. 
edb0: 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  As part of the s
edc0: 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ame allocation, 
edd0: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  allocate.  ** sp
ede0: 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c 6c  ace for the full
edf0: 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66 69   paths of the fi
ee00: 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61 6e  le, directory an
ee10: 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  d journal .  ** 
ee20: 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65  (Pager.zFilename
ee30: 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  , Pager.zDirecto
ee40: 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  ry and Pager.zJo
ee50: 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69  urnal)..  */.  i
ee60: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
ee70: 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20   ){.    nameLen 
ee80: 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61  = strlen(zFullPa
ee90: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  thname);.    pPa
eea0: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
eeb0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
eec0: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
eed0: 2b 20 33 30 20 29 3b 0a 20 20 20 20 69 66 28 20  + 30 );.    if( 
eee0: 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51  pPager && rc==SQ
eef0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ef00: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
ef10: 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
ef20: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53 51 4c  iteMallocRaw(SQL
ef30: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
ef40: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
ef50: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  }...  /* If an e
ef60: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
ef70: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
ef80: 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
ef90: 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a   the memory .  *
efa0: 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
efb0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66  zFullPathname, f
efc0: 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
efd0: 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
efe0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65  e the .  ** file
eff0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f000: 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
f010: 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
f020: 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
f030: 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
f040: 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
f050: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
f060: 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61   || !zFullPathna
f070: 6d 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  me || !pPager->p
f080: 54 6d 70 53 70 61 63 65 20 7c 7c 20 72 63 21 3d  TmpSpace || rc!=
f090: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f0a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
f0b0: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
f0c0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
f0d0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
f0e0: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
f0f0: 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
f100: 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f  LITE_OK)?SQLITE_
f110: 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a  NOMEM:rc);.  }..
f120: 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4f    PAGERTRACE3("O
f130: 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
f140: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20  LEHANDLEID(fd), 
f150: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f160: 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
f170: 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
f180: 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r, zFullPathname
f190: 29 29 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  )).  pPager->zFi
f1a0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
f1b0: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
f1c0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
f1d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
f1e0: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
f1f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
f200: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
f210: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
f220: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
f230: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f240: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
f250: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
f260: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
f270: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f280: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
f290: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
f2a0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f2b0: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
f2c0: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
f2d0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
f2e0: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
f2f0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f300: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f310: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
f320: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f330: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
f340: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
f350: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
f360: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
f370: 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  fd;.  /* pPager-
f380: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
f390: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75  ; */.  pPager->u
f3a0: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a  seJournal = useJ
f3b0: 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62  ournal && !memDb
f3c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
f3d0: 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c  adlock = noReadl
f3e0: 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b  ock && readOnly;
f3f0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f400: 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
f410: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
f420: 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
f430: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
f440: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f450: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62  ->dbSize = memDb
f460: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61  -1;.  pPager->pa
f470: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
f480: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
f490: 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  E;.  /* pPager->
f4a0: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
f4b0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f4c0: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
f4d0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
f4e0: 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ge = 0; */.  /* 
f4f0: 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
f500: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f510: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b  r->mxPage = 100;
f520: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
f530: 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20  _UNLOCK==0 );.  
f540: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
f550: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
f560: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f570: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
f580: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
f590: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
f5a0: 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
f5b0: 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
f5c0: 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
f5d0: 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
f5e0: 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
f5f0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
f600: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
f610: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f620: 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
f630: 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
f640: 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
f650: 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
f660: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
f670: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
f680: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
f690: 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
f6a0: 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
f6b0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
f6c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
f6d0: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
f6e0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
f6f0: 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
f700: 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70  ync?0:1);.  /* p
f710: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
f720: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f730: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
f740: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f750: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
f760: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
f770: 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
f780: 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
f790: 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44   assert(fd||memD
f7a0: 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  b);.  if( !memDb
f7b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f7c0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
f7d0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
f7e0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  (fd);.  }.  /* p
f7f0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
f800: 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
f810: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
f820: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
f830: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
f840: 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
f850: 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
f860: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
f870: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
f880: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  .  pPager->pNext
f890: 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
f8a0: 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20  .  pTsd->pPager 
f8b0: 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66  = pPager;.#endif
f8c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f8d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
f8e0: 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
f8f0: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
f900: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
f910: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
f920: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
f930: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
f940: 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
f950: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
f960: 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
f970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
f980: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
f990: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
f9a0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
f9b0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
f9c0: 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
f9d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
f9e0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
f9f0: 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
fa00: 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
fa10: 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
fa20: 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
fa30: 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
fa40: 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
fa50: 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
fa60: 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
fa70: 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
fa80: 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
fa90: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
faa0: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
fab0: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
fac0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
fad0: 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
fae0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
faf0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
fb00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
fb10: 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
fb20: 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
fb30: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
fb40: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
fb50: 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
fb60: 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
fb70: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
fb80: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
fb90: 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
fba0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
fbb0: 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
fbc0: 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
fbd0: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
fbe0: 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
fbf0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
fc00: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
fc10: 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
fc20: 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
fc30: 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
fc40: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
fc50: 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
fc60: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
fc70: 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
fc80: 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
fc90: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
fca0: 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
fcb0: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
fcc0: 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
fcd0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
fce0: 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
fcf0: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
fd00: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
fd10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
fd20: 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75  size.  If the su
fd30: 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a  ggest new page.*
fd40: 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72  * size is inappr
fd50: 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
fd60: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
fd70: 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74  e size is select
fd80: 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ed.** and return
fd90: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fda0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
fdb0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
fdc0: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
fdd0: 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
fde0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
fdf0: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
fe00: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
fe10: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
fe20: 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
fe30: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ef==0 ){.    pag
fe40: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
fe50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61  ;.    pPager->pa
fe60: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
fe70: 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  e;.    pPager->p
fe80: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
fe90: 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  e3ReallocOrFree(
fea0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
feb0: 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
fec0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
fed0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  r->pageSize;.}..
fee0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
fef0: 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
ff00: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
ff10: 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
ff20: 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
ff30: 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
ff40: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
ff50: 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
ff60: 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
ff70: 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
ff80: 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
ff90: 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
ffa0: 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
ffb0: 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
ffc0: 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
ffd0: 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
ffe0: 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
fff0: 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
10000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
10010 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
10020 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10030 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
10040 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10050 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
10060 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
10070 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
10080 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10090 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
100a0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
100b0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
100c0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
100d0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
100e0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
100f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10100 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
10110 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
10120 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
10130 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
10140 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
10150 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10160 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
10170 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10180 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
10190 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
101a0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
101b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
101c0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
101d0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
101e0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
101f0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
10200 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
10210 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
10220 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
10230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
10240 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
10250 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
10260 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
10270 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
10280 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
10290 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
102a0 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
102b0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
102c0 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
102d0 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
102e0 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
102f0 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
10300 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
10310 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
10320 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
10330 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
10340 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
10350 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
10360 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
10370 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
10380 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
10390 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
103a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
103b0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
103c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
103d0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
103e0 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
103f0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62  ==0 ){.    disab
10400 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10410 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
10420 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
10430 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
10440 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
10450 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10460 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
10470 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
10480 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
10490 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
104a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
104b0 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20  st, N);.    if( 
104c0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
104d0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
104e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
104f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
10500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10510 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10520 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
10530 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
10540 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
10550 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
10560 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
10570 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
10580 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
10590 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
105a0 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
105b0 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
105c0 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
105d0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
105e0 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
105f0 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
10600 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
10610 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
10620 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
10630 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
10640 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
10650 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
10660 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
10670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10680 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
10690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
106a0 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63   i64 n;.  int rc
106b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
106c0 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
106d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
106e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
106f0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
10700 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
10710 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
10720 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
10730 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  {.    if( (rc = 
10740 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
10750 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
10760 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
10770 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
10780 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
10790 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
107a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
107b0 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
107c0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
107d0 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
107e0 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
107f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10800 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
10810 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
10820 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
10830 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
10840 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
10850 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
10860 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
10870 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
10880 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
10890 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  rn n;.}...#ifnde
108a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
108b0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65  MORYDB./*.** Cle
108c0 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62  ar a PgHistory b
108d0 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lock.*/.static v
108e0 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79  oid clearHistory
108f0 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73  (PgHistory *pHis
10900 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t){.  sqliteFree
10910 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
10920 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
10930 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
10940 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
10950 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
10960 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
10970 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
10980 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
10990 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
109a0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
109b0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
109c0 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Pager*);../*.** 
109d0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
109e0 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
109f0 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
10a00 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
10a10 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
10a20 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
10a30 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
10a40 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
10a50 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
10a60 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
10a70 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
10a80 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
10a90 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
10aa0 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
10ab0 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
10ac0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
10ad0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
10ae0 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
10af0 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
10b00 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
10b10 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
10b20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
10b30 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
10b40 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
10b50 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65  ==0 && pPg->pPre
10b60 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
10b70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
10b80 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
10b90 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
10ba0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
10bb0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
10bc0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
10bd0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
10be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10bf0 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70  er->aHash[pPg->p
10c00 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
10c10 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b  Hash-1)]!=pPg );
10c20 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
10c30 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
10c40 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
10c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10c60 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20  t h = pPg->pgno 
10c70 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
10c80 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  -1);.    pPager-
10c90 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
10ca0 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
10cb0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
10cc0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
10cd0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
10ce0 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d  g, pPager));.  }
10cf0 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
10d00 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
10d10 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
10d20 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
10d30 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
10d40 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
10d50 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
10d60 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
10d70 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
10d80 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
10d90 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
10da0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10db0 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
10dc0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
10dd0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
10de0 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
10df0 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
10e00 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
10e10 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
10e20 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
10e30 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
10e40 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10e50 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
10e60 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
10e70 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
10e80 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
10e90 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
10ea0 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
10eb0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10ec0 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
10ed0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
10ee0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
10ef0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
10f00 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
10f10 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
10f20 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
10f30 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10f50 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
10f60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
10f70 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
10f80 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
10f90 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
10fa0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
10fb0 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
10fc0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
10fd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10fe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
10ff0 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
11000 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
11010 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11020 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
11030 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
11040 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
11050 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
11060 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
11070 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
11080 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
11090 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
110a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
110b0 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
110c0 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
110d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
110e0 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
110f0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
11100 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
11110 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
11120 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
11130 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
11140 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
11150 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
11160 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
11170 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
11180 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
11190 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
111a0 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
111b0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
111c0 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
111d0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
111e0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
111f0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
11200 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
11210 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
11220 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
11230 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
11240 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
11250 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
11260 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
11270 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
11280 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11290 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
112a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
112b0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
112c0 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
112d0 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
112e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
112f0 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
11300 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
11310 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
11320 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
11330 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
11340 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
11350 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11360 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
11370 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
11380 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
11390 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
113a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
113b0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
113c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
113d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
113e0 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
113f0 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  All;.      IOTRA
11400 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
11410 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
11420 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
11430 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
11440 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
11450 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75  _count);.      u
11460 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
11470 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
11480 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
11490 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
114a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
114b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
114c0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
114d0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
114e0 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
114f0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
11500 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
11510 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
11520 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
11530 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75  eat until the bu
11540 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
11550 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
11560 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
11570 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
11580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11590 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
115a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
115b0 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
115c0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
115d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
115e0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
115f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
11600 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
11610 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
11620 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
11630 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
11640 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
11650 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
11660 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
11670 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
11680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
11690 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
116a0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
116b0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
116c0 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
116d0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
116e0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
116f0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
11700 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
11710 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
11720 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
11730 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
11740 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
11750 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c  ager->dbSize<0 |
11760 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66  | MEMDB );..  if
11770 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11780 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
11790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
117a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
117b0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
117c0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
117d0 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
117e0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
117f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
11800 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
11810 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
11820 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
11830 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
11840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11850 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11860 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
11870 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
11880 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
11890 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
118a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
118b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
118c0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
118d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
118e0 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
118f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11900 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50  3PagerTruncate(P
11910 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11920 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
11930 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
11940 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
11950 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45  GER_SHARED || ME
11960 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  MDB );.  sqlite3
11970 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11980 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
11990 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
119a0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
119b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72  ->errCode;.    r
119c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
119d0 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
119e0 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
119f0 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
11a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11a10 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
11a20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
11a30 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
11a40 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
11a50 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
11a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a70 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
11a80 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
11a90 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
11aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
11ac0 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
11ad0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
11ae0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
11af0 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
11b00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
11b10 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
11b20 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
11b30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11b40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
11b50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
11b60 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
11b70 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67  ate(pPager, nPag
11b80 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
11b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
11ba0 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
11bb0 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
11bc0 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
11bd0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
11be0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11bf0 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
11c00 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
11c10 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
11c20 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
11c30 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11c40 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
11c50 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
11c60 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
11c70 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
11c80 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
11c90 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
11ca0 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
11cb0 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
11cc0 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
11cd0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11ce0 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
11cf0 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
11d00 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
11d10 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
11d20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
11d30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
11d40 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
11d50 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
11d60 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
11d70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
11d80 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
11d90 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
11da0 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
11db0 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
11dc0 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
11dd0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
11de0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
11df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11e00 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
11e10 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51  ager){.#ifdef SQ
11e20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
11e30 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
11e40 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
11e50 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
11e60 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
11e70 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
11e80 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
11e90 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
11ea0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
11eb0 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
11ec0 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
11ed0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
11ee0 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
11ef0 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
11f00 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
11f10 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
11f20 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
11f30 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
11f40 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  can be set..  */
11f50 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
11f60 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
11f70 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
11f80 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20  ert( pPager );. 
11f90 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26   assert( pTsd &&
11fa0 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b   pTsd->nAlloc );
11fb0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
11fc0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11fd0 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67  errors();.  pPag
11fe0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
11ff0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
12000 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
12010 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
12020 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  er);.  pagerUnlo
12030 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
12040 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  ager);.  enable_
12050 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
12060 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
12070 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
12080 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
12090 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  r));.  IOTRACE((
120a0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
120b0 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74 28  ager)).  assert(
120c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
120d0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
120e0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70  rnalOpen==0 && p
120f0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d  Pager->stmtOpen=
12100 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  =0) );.  if( pPa
12110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12120 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12130 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
12140 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
12150 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
12160 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  InJournal);.  if
12170 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
12180 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
12190 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
121a0 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
121b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
121c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
121d0 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
121e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
121f0 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
12200 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
12210 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
12220 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
12230 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
12240 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
12250 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
12260 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
12270 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
12280 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
12290 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65  r from the linke
122a0 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
122b0 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20   starting at .  
122c0 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50  ** ThreadData.pP
122d0 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  ager if memory-m
122e0 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
122f0 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bled..  */.  if(
12300 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70   pPager==pTsd->p
12310 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73  Pager ){.    pTs
12320 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
12330 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  er->pNext;.  }el
12340 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70  se{.    Pager *p
12350 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d  Tmp;.    for(pTm
12360 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  p = pTsd->pPager
12370 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70  ; pTmp->pNext!=p
12380 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70  Pager; pTmp=pTmp
12390 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70  ->pNext){}.    p
123a0 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  Tmp->pNext = pPa
123b0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
123c0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46  #endif.  sqliteF
123d0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
123e0 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  h);.  sqliteFree
123f0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
12400 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ce);.  sqliteFre
12410 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
12420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12430 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
12440 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
12450 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
12460 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
12470 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12480 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
12490 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
124a0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
124b0 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
124c0 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
124d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
124e0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
124f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
12500 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
12510 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
12520 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12530 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
12540 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
12550 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
12560 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
12570 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
12580 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
12590 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
125a0 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
125b0 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
125c0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
125d0 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
125e0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
125f0 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
12600 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
12610 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
12620 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
12630 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
12640 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
12650 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
12660 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
12670 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
12680 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
12690 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
126a0 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
126b0 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70   if( pPg==pPg->p
126c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
126d0 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ced ){.      PgH
126e0 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
126f0 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68  xtFree;.      wh
12700 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
12710 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
12720 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
12730 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12740 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
12750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12760 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
12770 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
12780 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
12790 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
127a0 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
127b0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
127c0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
127d0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
127e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
127f0 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
12800 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
12810 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
12820 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
12830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
12840 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  g->pPager->pLast
12850 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
12860 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  e;.    }.    pPg
12870 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
12880 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
12890 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f++;.  REFINFO(p
128a0 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  Pg);.}.#ifdef SQ
128b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
128c0 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
128d0 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
128e0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
128f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
12900 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
12910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
12920 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
12930 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
12940 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
12950 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
12960 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
12970 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
12980 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
12990 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
129a0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
129b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
129c0 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
129d0 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
129e0 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
129f0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
12a00 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
12a10 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
12a20 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72   *pPg){.  page_r
12a30 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
12a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12a50 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
12a60 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
12a70 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
12a80 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
12a90 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
12aa0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
12ab0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
12ac0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
12ad0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
12ae0 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
12af0 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
12b00 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
12b10 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
12b20 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
12b30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
12b40 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
12b50 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12b60 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
12b70 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
12b80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
12b90 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
12ba0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
12bb0 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
12bc0 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
12bd0 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
12be0 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
12bf0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
12c00 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
12c10 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
12c20 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
12c30 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
12c40 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
12c50 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
12c60 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
12c70 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
12c80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
12c90 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
12ca0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
12cb0 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
12cc0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
12cd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
12ce0 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
12cf0 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
12d00 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
12d10 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
12d20 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
12d30 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
12d40 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
12d50 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
12d60 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
12d70 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
12d80 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
12d90 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
12da0 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
12db0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
12dc0 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
12dd0 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
12de0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
12df0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
12e00 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
12e10 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
12e20 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
12e30 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
12e40 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
12e50 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
12e60 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
12e70 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
12e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
12e90 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12ea0 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
12eb0 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
12ec0 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
12ed0 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
12ee0 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
12ef0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
12f00 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
12f10 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
12f20 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
12f30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
12f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
12f50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12f60 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
12f70 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
12f80 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
12f90 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
12fa0 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
12fb0 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
12fc0 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
12fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12fe0 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
12ff0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
13000 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
13010 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
13020 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
13030 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
13040 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
13050 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
13060 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
13070 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
13080 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
13090 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
130a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
130b0 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
130c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
130d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
130e0 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
130f0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
13100 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
13110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13120 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
13130 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13140 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
13150 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
13160 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
13170 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
13180 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
13190 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
131a0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
131b0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
131c0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
131d0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
131e0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
131f0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
13200 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
13210 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
13220 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
13230 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
13240 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
13250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13260 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
13270 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
13280 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
13290 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
132a0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
132b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
132c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
132d0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
132e0 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
132f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13300 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  c(pPager->jfd, 0
13310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13320 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
13330 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13340 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13350 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
13360 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >jfd,.          
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13390 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
133a0 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
133b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
133c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
133d0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
133e0 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
133f0 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
13400 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13410 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
13420 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
13430 67 69 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20  gic), 4)).      
13440 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
13450 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
13460 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
13470 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
13480 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
13490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
134a0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
134b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
134c0 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  nalOff);.       
134d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
134e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
134f0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
13500 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
13510 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13520 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
13530 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
13540 64 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  d\n", pPager)). 
13550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13560 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13570 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
13580 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20  l_fsync);.      
13590 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
135a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
135b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
135c0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
135d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
135e0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
135f0 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
13600 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
13610 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
13620 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
13630 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
13640 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
13650 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
13660 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
13670 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
13680 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
13690 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
136a0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
136b0 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
136c0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
136d0 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
136e0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
136f0 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
13700 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
13710 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
13720 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
13730 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
13740 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
13750 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
13760 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
13770 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
13780 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
13790 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
137a0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
137b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
137c0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
137d0 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
137e0 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
137f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13800 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
13810 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
13820 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
13830 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
13840 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
13850 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
13860 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
13870 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
13880 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
13890 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
138a0 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
138b0 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
138c0 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
138d0 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
138e0 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
138f0 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
13900 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
13910 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13920 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
13930 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
13940 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
13950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
13960 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
13970 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13980 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
13990 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
139a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
139b0 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
139c0 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
139d0 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
139e0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
139f0 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
13a00 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13a10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13a20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
13a30 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
13a40 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
13a50 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
13a60 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
13a70 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
13a80 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
13a90 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
13aa0 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
13ab0 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
13ac0 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
13ad0 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
13ae0 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35  _BUCKET_ALLOC 25
13af0 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
13b00 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a  BUCKET       25.
13b10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
13b20 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
13b30 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
13b40 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64  cket = 0;.  #und
13b50 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ef N_SORT_BUCKET
13b60 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  .  #define N_SOR
13b70 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73  T_BUCKET \.   (s
13b80 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
13b90 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74  ort_bucket?sqlit
13ba0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
13bb0 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55  bucket:N_SORT_BU
13bc0 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64  CKET_ALLOC).#end
13bd0 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  if.static PgHdr 
13be0 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50  *sort_pagelist(P
13bf0 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67  gHdr *pIn){.  Pg
13c00 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55  Hdr *a[N_SORT_BU
13c10 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b  CKET_ALLOC], *p;
13c20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
13c30 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
13c40 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
13c50 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
13c60 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
13c70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
13c80 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
13c90 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
13ca0 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
13cb0 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
13cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
13cd0 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
13ce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
13cf0 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
13d00 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
13d10 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
13d20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
13d30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13d40 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
13d50 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  -1 ){.      /* C
13d60 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20  overage: To get 
13d70 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64  here, there need
13d80 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54   to be 2^(N_SORT
13d90 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20  _BUCKET) .      
13da0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ** elements in t
13db0 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54  he input list. T
13dc0 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c  his is possible,
13dd0 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c   but impractical
13de0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69  ..      ** Testi
13df0 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  ng this line is 
13e00 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f  the point of glo
13e10 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20  bal variable.   
13e20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61     ** sqlite3_pa
13e30 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
13e40 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
13e50 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
13e60 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
13e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
13e80 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
13e90 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
13ea0 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
13eb0 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
13ec0 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
13ed0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
13ee0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
13ef0 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
13f00 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
13f10 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
13f20 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
13f30 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
13f40 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
13f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
13f60 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
13f70 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
13f80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13f90 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
13fa0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
13fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
13fc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
13fd0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
13ff0 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
14000 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
14010 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
14020 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
14030 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
14040 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
14050 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
14060 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
14070 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
14080 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
14090 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
140a0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
140b0 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
140c0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
140d0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
140e0 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
140f0 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
14100 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
14110 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
14120 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
14130 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
14140 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14150 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
14160 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
14170 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
14180 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
14190 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
141a0 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
141b0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
141c0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
141d0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
141e0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
141f0 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
14200 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
14210 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
14220 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
14230 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
14240 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
14250 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
14260 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
14270 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
14280 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
14290 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
142a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
142b0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
142c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
142d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
142e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
142f0 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
14300 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
14310 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
14320 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
14330 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
14340 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
14350 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
14360 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
14370 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
14380 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
14390 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
143a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
143b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
143c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
143d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74  rc;.  }..  pList
143e0 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74   = sort_pagelist
143f0 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65  (pList);.  while
14400 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
14410 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
14420 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rty );.    rc = 
14430 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
14440 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
14450 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
14460 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14470 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
14480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a  eturn rc;.    /*
14490 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
144a0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
144b0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
144c0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
144d0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
144e0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
144f0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
14500 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
14510 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
14520 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
14530 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
14540 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
14550 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
14560 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
14570 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
14580 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
14590 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
145a0 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
145b0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
145c0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
145d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
145e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
145f0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
14600 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
14610 45 52 54 52 41 43 45 33 28 22 53 54 4f 52 45 20  ERTRACE3("STORE 
14620 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
14630 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
14640 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
14650 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
14660 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
14670 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
14680 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
14690 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
146a0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
146b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
146c0 7a 65 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  ze);.      PAGER
146d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
146e0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
146f0 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
14700 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
14710 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
14720 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
14730 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
14740 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
14750 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
14760 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
14770 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
14780 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
14790 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
147a0 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69  c;.    pList->di
147b0 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
147c0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
147d0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
147e0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
147f0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
14800 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
14810 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
14820 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14840 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
14850 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
14860 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
14870 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
14880 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
14890 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
148a0 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
148b0 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
148c0 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
148d0 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
148e0 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
148f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
14900 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
14910 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14920 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d  Pager->pDirty;.}
14930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
14940 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20  RUE if there is 
14950 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
14960 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
14970 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
14980 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
14990 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
149a0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
149b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
149c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
149d0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
149e0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
149f0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
14a00 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
14a10 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
14a20 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
14a30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
14a40 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
14a50 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
14a60 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  e journal..*/.st
14a70 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
14a80 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
14a90 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
14aa0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14ab0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14ac0 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
14ad0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
14ae0 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
14af0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14b00 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68   if( sqlite3OsCh
14b10 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14b20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
14b30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14b40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
14b50 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
14b60 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ger)==0 ){.    s
14b70 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14b80 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14b90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
14bb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
14bc0 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
14bd0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
14be0 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
14bf0 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
14c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
14c10 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
14c20 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
14c30 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
14c40 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
14c50 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
14c60 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
14c70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14c80 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
14c90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14ca0 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20  t syncOk, PgHdr 
14cb0 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
14cc0 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
14cd0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d   0;..  assert(!M
14ce0 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  EMDB);..  /* Fin
14cf0 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
14d00 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
14d10 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
14d20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
14d30 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
14d40 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
14d50 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
14d60 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
14d70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
14d80 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
14d90 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
14da0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
14db0 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
14dc0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
14dd0 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
14de0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
14df0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
14e00 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
14e10 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
14e20 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
14e30 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
14e40 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
14e50 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
14e60 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
14e70 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
14e80 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26  rst && syncOk &&
14e90 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e   !MEMDB){.    in
14ea0 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
14eb0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
14ec0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
14ed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14ef0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14f00 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
14f10 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
14f20 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
14f30 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
14f40 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  he.      ** jour
14f50 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
14f60 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
14f70 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
14f80 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14f90 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
14fa0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
14fb0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
14fc0 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
14fd0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
14fe0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
14ff0 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
15000 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
15010 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68  s.      ** trash
15020 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
15030 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
15040 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d)..      */.   
15050 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
15060 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
15070 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
15080 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
15090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
150a0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
150b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
150c0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
150d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
150e0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
150f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15100 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
15110 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
15120 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
15130 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
15140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15150 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
15160 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
15170 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
15180 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
15190 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
151a0 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
151b0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
151c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
151d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
151e0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
151f0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
15200 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
15210 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
15220 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
15230 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
15240 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
15250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15280 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
15290 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
152a0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
152b0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
152c0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
152d0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
152e0 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
152f0 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
15300 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
15310 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
15320 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
15330 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
15340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
15350 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
15360 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
15370 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
15380 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
15390 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
153a0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
153b0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
153c0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
153d0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
153e0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
153f0 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
15400 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
15410 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
15420 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
15430 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
15440 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
15450 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
15460 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
15470 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
15480 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
15490 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
154a0 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
154b0 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
154c0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
154d0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
154e0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
154f0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
15500 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
15510 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
15520 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
15530 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
15540 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
15550 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
15560 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
15570 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15580 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
15590 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
155a0 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
155b0 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
155c0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
155d0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
155e0 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
155f0 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
15600 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
15610 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
15620 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
15630 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
15640 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e   sqliteFree()ed.
15650 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
15660 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15670 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
15680 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
15690 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
156a0 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
156b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
156c0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
156d0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
156e0 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
156f0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
15700 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
15710 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
15720 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
15730 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
15740 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
15750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15760 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15770 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
15780 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
15790 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
157a0 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
157b0 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  a *pTsdro = sqli
157c0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
157d0 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20 6e  dOnly();.  int n
157e0 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
157f0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
15800 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
15810 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
15820 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
15830 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
15840 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
15850 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
15860 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
15870 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
15880 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
15890 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
158a0 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
158b0 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
158c0 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
158d0 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
158e0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
158f0 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
15900 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15910 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
15920 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
15930 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
15940 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
15950 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
15960 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
15970 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
15980 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
15990 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
159a0 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
159b0 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
159c0 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
159d0 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
159e0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
159f0 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
15a00 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
15a10 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
15a20 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
15a30 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
15a40 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
15a50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
15a60 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
15a70 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15a80 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
15a90 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
15aa0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15ab0 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65 72  ad. */.    Pager
15ac0 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64 72   *pPager = pTsdr
15ad0 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 66  o->pPager;.    f
15ae0 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26 20  or( ; pPager && 
15af0 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
15b00 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61 67  ased<nReq); pPag
15b10 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
15b20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
15b30 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  pPg;.      int r
15b40 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d 45  c;..      if( ME
15b50 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 63  MDB ){.        c
15b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
15b70 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
15b80 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
15b90 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
15ba0 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
15bb0 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
15bc0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
15bd0 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
15be0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
15bf0 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
15c00 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
15c10 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
15c20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
15c30 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
15c40 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
15c50 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
15c60 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
15c70 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
15c80 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
15c90 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
15ca0 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
15cb0 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
15cc0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
15cd0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
15ce0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
15cf0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
15d00 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
15d10 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
15d20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
15d30 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
15d40 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
15d50 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
15d60 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
15d70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
15d80 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
15d90 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
15da0 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
15db0 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
15dc0 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
15dd0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
15de0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
15df0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
15e00 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
15e10 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
15e20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
15e30 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
15e40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
15e50 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
15e60 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
15e70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  e{.          for
15e80 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70  ( pTmp=pPager->p
15e90 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  All; pTmp->pNext
15ea0 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70  All!=pPg; pTmp=p
15eb0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
15ec0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70  }.          pTmp
15ed0 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
15ee0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
15ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52      }.        nR
15f00 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74  eleased += sqlit
15f10 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b  eAllocSize(pPg);
15f20 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
15f30 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
15f40 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
15f50 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  >pgno));.       
15f60 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
15f70 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
15f80 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
15f90 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
15fa0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15fb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15fc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
15fd0 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
15fe0 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
15ff0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16000 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
16010 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
16020 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
16030 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
16040 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
16050 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  e .        ** ca
16060 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
16070 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
16080 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
16090 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
160a0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65          ** The e
160b0 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
160c0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
160d0 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
160e0 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
160f0 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
16100 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
16110 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
16120 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
16130 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20  ccured..        
16140 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
16150 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  t( (rc&0xff)==SQ
16160 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63  LITE_IOERR || rc
16170 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  ==SQLITE_FULL );
16180 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16190 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
161a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
161b0 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
161c0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
161d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
161e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
161f0 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
16200 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
16210 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
16220 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
16230 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
16240 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
16250 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16260 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
16270 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
16280 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16290 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
162a0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
162b0 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42  .  assert( MEMDB
162c0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
162d0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
162e0 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
162f0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
16300 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
16310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16330 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
16340 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
16350 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20  (pPg),.         
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16380 65 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 5f  e);.  }.  PAGER_
16390 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
163a0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
163b0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
163c0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
163d0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
163e0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
163f0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
16400 52 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25  RTRACE3("FETCH %
16410 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
16420 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
16430 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 43 4f 44  Pg->pgno);.  COD
16440 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
16450 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
16460 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
16470 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
16480 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
164a0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
164b0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
164c0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
164d0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
164e0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
164f0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
16500 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
16510 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
16520 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
16530 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
16540 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
16550 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
16560 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
16570 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
16580 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
16590 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
165a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
165b0 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
165c0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
165d0 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
165e0 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
165f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16600 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
16610 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16620 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16630 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
16640 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
16650 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
16660 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
16670 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16680 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
16690 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
166a0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
166b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
166c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
166d0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
166e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
166f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16710 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16720 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
16740 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16750 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
16760 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
16770 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
16780 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
16790 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
167a0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
167b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
167c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
167d0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
167e0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
167f0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
16800 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
16810 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
16820 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
16830 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
16840 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16850 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16860 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
16870 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
16880 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
16890 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
168a0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
168b0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
168c0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
168d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
168e0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
168f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
16900 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
16910 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16920 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
16930 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
16940 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
16950 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
16960 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
16970 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
16980 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
16990 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
169a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63   .        ** bac
169b0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  k..        ** . 
169c0 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
169d0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
169e0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
169f0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
16a00 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  d, the.        *
16a10 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
16a20 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
16a30 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
16a40 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
16a50 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69          ** obtai
16a60 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
16a70 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
16a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16a90 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16ab0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
16ac0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
16ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16af0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
16b00 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
16b10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16b20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16b30 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16b40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
16b50 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
16b60 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20  R_EXCLUSIVE;. . 
16b70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
16b80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
16b90 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
16ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
16bb0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
16bc0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
16bd0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
16be0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
16bf0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
16c00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
16c10 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
16c20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
16c30 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
16c40 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
16c50 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
16c60 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
16c70 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
16c80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
16c90 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
16ca0 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
16cb0 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
16cc0 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
16cd0 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
16ce0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
16cf0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
16d00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
16d10 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16d20 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
16d30 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
16d40 62 65 63 61 75 73 65 20 69 6e 20 0a 09 2a 2a 20  because in ..** 
16d50 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
16d60 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
16d70 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
16d80 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a  e kept open and.
16d90 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
16da0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
16db0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
16dc0 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
16dd0 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
16de0 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
16df0 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
16e00 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
16e10 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
16e20 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  es.        ** a 
16e30 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
16e40 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20  handle..        
16e50 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
16e60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16e70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16e80 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
16e90 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29  ger->zJournal) )
16ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
16eb0 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ro;.          as
16ec0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
16ed0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
16ee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16ef0 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
16f00 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
16f10 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
16f20 20 26 72 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   &ro);.         
16f30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
16f40 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
16f50 2d 3e 6a 66 64 20 29 3b 0a 20 20 20 20 20 20 20  ->jfd );.       
16f60 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20 20 20     if( ro ){.   
16f70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16f80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
16fa0 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
16fb0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
16fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16ff0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
17000 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17020 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
17030 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17040 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
17050 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17060 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
17080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
170a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
170b0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
170c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
170d0 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a   0;. .        /*
170e0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
170f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
17100 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
17110 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
17120 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
17130 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
17140 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  d lock..        
17150 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
17160 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
17170 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
17180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
171a0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
171b0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
171c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
171d0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
171e0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
171f0 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20  SHARED || .     
17200 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17210 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
17220 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
17230 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
17240 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
17250 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
17260 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
17270 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
17280 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
17290 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
172a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
172b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
172c0 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
172d0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
172e0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
172f0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a  evious.        *
17300 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
17310 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 49 66  transaction). If
17320 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17330 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
17340 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
17350 65 64 20 69 6e 20 50 61 67 65 72 2e 69 43 68 61  ed in Pager.iCha
17360 6e 67 65 43 6f 75 6e 74 20 6d 61 74 63 68 65 73  ngeCount matches
17370 20 74 68 61 74 20 66 6f 75 6e 64 20 6f 6e 20 70   that found on p
17380 61 67 65 20 31 20 6f 66 0a 20 20 20 20 20 20 20  age 1 of.       
17390 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
173a0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 64   file, then no d
173b0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
173c0 68 61 76 65 20 6f 63 63 75 72 65 64 20 73 69 6e  have occured sin
173d0 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ce.        ** th
173e0 65 20 63 61 63 68 65 20 77 61 73 20 6c 61 73 74  e cache was last
173f0 20 76 61 6c 69 64 20 61 6e 64 20 69 74 20 69 73   valid and it is
17400 20 73 61 66 65 20 74 6f 20 72 65 74 61 69 6e 20   safe to retain 
17410 74 68 65 20 63 61 63 68 65 64 0a 20 20 20 20 20  the cached.     
17420 20 20 20 2a 2a 20 70 61 67 65 73 2e 20 4f 74 68     ** pages. Oth
17430 65 72 77 69 73 65 2c 20 69 66 20 50 61 67 65 72  erwise, if Pager
17440 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 64 6f  .iChangeCount do
17450 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
17460 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e  .        ** chan
17470 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 20 70 61  ge-counter on pa
17480 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
17490 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  , the current ca
174a0 63 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  che contents.   
174b0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20       ** must be 
174c0 64 69 73 63 61 72 64 65 64 2e 0a 20 20 20 20 20  discarded..     
174d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38     */.        u8
174e0 20 7a 43 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20   zC[4];.        
174f0 75 33 32 20 69 43 68 61 6e 67 65 43 6f 75 6e 74  u32 iChangeCount
17500 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
17510 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17520 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a  count(pPager);..
17530 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
17540 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
17550 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17560 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
17570 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17580 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17590 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
175a0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
175b0 65 20 34 2d 62 79 74 65 20 63 68 61 6e 67 65 20  e 4-byte change 
175c0 63 6f 75 6e 74 65 72 20 64 69 72 65 63 74 6c 79  counter directly
175d0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2e 20   from the file. 
175e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
175f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
17600 70 50 61 67 65 72 2d 3e 66 64 2c 20 32 34 29 3b  pPager->fd, 24);
17610 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17630 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17640 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
17650 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
17660 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
17670 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 43 2c 20  pPager->fd, zC, 
17680 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
17690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
176a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
176b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
176c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
176d0 69 43 68 61 6e 67 65 43 6f 75 6e 74 65 72 20 3d  iChangeCounter =
176e0 20 28 7a 43 5b 30 5d 3c 3c 32 34 29 20 2b 20 28   (zC[0]<<24) + (
176f0 7a 43 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 7a 43  zC[1]<<16) + (zC
17700 5b 32 5d 3c 3c 38 29 20 2b 20 7a 43 5b 33 5d 3b  [2]<<8) + zC[3];
17710 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17720 20 20 20 20 69 66 28 20 69 43 68 61 6e 67 65 43      if( iChangeC
17730 6f 75 6e 74 65 72 21 3d 70 50 61 67 65 72 2d 3e  ounter!=pPager->
17740 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 29 7b 0a  iChangeCount ){.
17750 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
17760 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17770 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17780 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20  >iChangeCount = 
17790 69 43 68 61 6e 67 65 43 6f 75 6e 74 65 72 3b 0a  iChangeCounter;.
177a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
177b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
177c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
177d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
177e0 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
177f0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
17800 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17810 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
17820 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17830 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
17840 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
17850 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
17860 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
17870 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e   a PgHdr object.
17880 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65     Either create
17890 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65   a new one or re
178a0 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  use.** an existi
178b0 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ng one that is n
178c0 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  ot otherwise in 
178d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  use..**.** A new
178e0 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
178f0 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61   is created if a
17900 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
17910 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a  ing are.** true:
17920 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
17930 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65  We have not exce
17940 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d  eded our maximum
17950 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65   allocated cache
17960 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20   size.**        
17970 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20    as set by the 
17980 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
17990 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ze" command..**.
179a0 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
179b0 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20  e are no unused 
179c0 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76  PgHdr objects av
179d0 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20  ailable at this 
179e0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  time..**.**     
179f0 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  (3)  This is an 
17a00 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
17a10 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  se..**.**     (4
17a20 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
17a30 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68  PgHdr objects th
17a40 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  at do not requir
17a50 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  e a journal.**  
17a60 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e          file syn
17a70 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20  c and a sync of 
17a80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17a90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
17aa0 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62            prohib
17ab0 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ited..**.** Othe
17ac0 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20  rwise, reuse an 
17ad0 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20  existing PgHdr. 
17ae0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17af0 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69   reuse an.** exi
17b00 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61  sting PgHdr if a
17b10 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
17b20 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
17b30 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
17b40 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20  have reached or 
17b50 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78  exceeded the max
17b60 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a  imum cache size.
17b70 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
17b80 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63  wed by "PRAGMA c
17b90 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a  ache_size"..**.*
17ba0 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
17bb0 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69   is a PgHdr avai
17bc0 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72  lable with PgHdr
17bd0 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20  ->nRef==0.**.** 
17be0 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20      (3)  We are 
17bf0 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d  not in an in-mem
17c00 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  ory database.**.
17c10 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68  **     (4)  Eith
17c20 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  er there is an a
17c30 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74  vailable PgHdr t
17c40 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
17c50 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f  d.**          to
17c60 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69   be synced to di
17c70 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20  sk or else disk 
17c80 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65  syncing is curre
17c90 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
17ca0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61   allowed..*/.sta
17cb0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c  tic int pagerAll
17cc0 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20  ocatePage(Pager 
17cd0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
17ce0 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  *ppPg){.  int rc
17cf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17d00 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
17d10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50  * Create a new P
17d20 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74  gHdr if any of t
17d30 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f  he four conditio
17d40 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a  ns defined .  **
17d50 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a   above is met: *
17d60 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
17d70 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
17d80 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
17d90 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  r->pFirst==0 .  
17da0 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
17db0 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  (pPager->pFirstS
17dc0 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
17dd0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
17de0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
17df0 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
17e00 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
17e10 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
17e20 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
17e30 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ,.         pPage
17e40 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
17e50 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
17e60 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  sh*2);.      if(
17e70 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
17e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
17e90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17ea0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
17eb0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
17ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ed0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
17ee0 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
17ef0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
17f00 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
17f30 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
17f40 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
17f70 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
17f80 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
17f90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17fa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
17fb0 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
17fc0 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
17fd0 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
17fe0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
17ff0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
18000 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
18010 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
18020 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
18030 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
18040 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
18050 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
18060 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
18070 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
18080 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
18090 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
180a0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
180b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
180c0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d  nPage>pPager->nM
180d0 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  axPage ){.      
180e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
180f0 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
18100 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
18110 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61       pPager->nMa
18120 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  xPage++;.    }. 
18130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
18140 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69  ecycle an existi
18150 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a  ng page with a z
18160 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a  ero ref-count. *
18170 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
18180 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
18190 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69   1, &pPg);.    i
181a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
181b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
181c0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
181d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
181e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
181f0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
18200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
18210 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
18220 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
18230 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
18240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18250 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
18260 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
18270 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
18280 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
18290 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
182a0 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
182b0 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
182c0 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
182d0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
182e0 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
182f0 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72  **.** A _get wor
18300 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
18310 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
18320 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
18330 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
18340 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
18350 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
18360 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
18370 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
18380 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
18390 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
183a0 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
183b0 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
183c0 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
183d0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
183e0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
183f0 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
18400 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
18410 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
18420 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
18430 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
18440 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
18450 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
18460 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
18470 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
18480 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
18490 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
184a0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
184b0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
184c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
184d0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
184e0 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
184f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
18500 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
18510 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
18520 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
18530 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
18540 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
18550 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
18560 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
18570 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
18580 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
18590 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
185a0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
185b0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
185c0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
185d0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
185e0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
185f0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
18600 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
18610 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
18620 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
18630 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
18640 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
18650 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
18660 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
18670 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
18680 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
18690 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
186a0 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
186b0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
186c0 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
186d0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
186e0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
186f0 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
18700 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
18710 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
18720 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
18730 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
18740 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
18750 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
18760 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
18770 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
18780 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
18790 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
187a0 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
187b0 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
187c0 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
187d0 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
187e0 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
187f0 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
18800 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
18810 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
18820 69 73 20 70 61 67 65 2c 20 74 68 61 74 20 6d 65  is page, that me
18830 61 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ans that the.** 
18840 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
18850 64 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  d and the disk r
18860 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
18870 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
18880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18890 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
188a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
188b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
188c0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
188d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
188e0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
188f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
18900 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
18910 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
18920 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
18930 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
18940 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
18950 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
18960 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
18970 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
18980 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
18990 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
189a0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
189b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
189c0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
189d0 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  _UNLOCK || pPage
189e0 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
189f0 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  o==1 );..  /* Th
18a00 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
18a10 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
18a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18a30 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
18a40 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
18a50 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
18a60 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
18a70 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
18a80 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
18a90 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
18aa0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
18ab0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
18ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18ad0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18ae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
18af0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
18b00 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
18b10 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
18b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18b30 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
18b40 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
18b50 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
18b60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
18b70 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
18b80 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18b90 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
18ba0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18bb0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
18bc0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
18bd0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
18be0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
18bf0 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
18c00 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
18c10 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
18c20 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
18c30 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
18c40 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
18c50 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
18c60 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
18c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18c80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18c90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18ca0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
18cb0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67  UNLOCK );..  pPg
18cc0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
18cd0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18ce0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
18cf0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
18d00 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
18d10 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
18d20 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  e. */.    int nM
18d30 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  ax;.    int h;. 
18d40 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
18d50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
18d60 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f    rc = pagerAllo
18d70 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c  catePage(pPager,
18d80 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
18d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18db0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
18dc0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
18dd0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
18de0 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72  B || pgno>pPager
18df0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20  ->stmtSize );.  
18e00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
18e10 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
18e20 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
18e30 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
18e40 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
18e50 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
18e60 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
18e70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18e80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18e90 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
18ea0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
18eb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18ec0 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
18ed0 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
18ee0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
18ef0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
18f00 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
18f10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
18f20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
18f30 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  c = 0;.    }..  
18f40 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
18f50 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
18f60 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
18f70 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67  (pPg);..    pPag
18f80 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
18f90 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
18fa0 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
18fb0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
18fc0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
18fd0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
18fe0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
18ff0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61  nMax = sqlite3Pa
19000 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
19010 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
19020 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
19030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
19040 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
19050 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
19060 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
19070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19080 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  }..    /* Popula
19090 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68  te the page with
190a0 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79   data, either by
190b0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
190c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
190d0 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65  * file, or by se
190e0 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  tting the entire
190f0 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20   page to zero.. 
19100 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d     */.    if( nM
19110 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
19120 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
19130 6e 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  nt ){.      mems
19140 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
19150 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
19160 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19170 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
19180 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20   = noContent;.  
19190 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
191a0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
191b0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
191c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
191d0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
191e0 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29  ager, pPg, pgno)
191f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19200 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
19210 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
19220 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
19230 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
19240 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
19250 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
19260 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
19270 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19280 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68    }.    /* If th
19290 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
192a0 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
192b0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69  value of Pager.i
192c0 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20  ChangeCount */. 
192d0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
192e0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
192f0 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72  iChangeCount = r
19300 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
19310 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 0a 20  g, 24);.    }.. 
19320 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
19330 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
19340 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
19350 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
19360 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
19370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
19380 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
19390 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
193a0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
193b0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
193c0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
193d0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
193e0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
193f0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
19400 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
19410 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
19420 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
19430 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
19440 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19450 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19460 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
19470 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
19480 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
19490 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
194a0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
194b0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
194c0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
194d0 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  rt(pPager->nRef>
194e0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
194f0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
19500 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
19510 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
19520 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
19530 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
19540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19550 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
19560 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
19570 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
19580 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
19590 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
195a0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
195b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
195c0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
195d0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
195e0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
195f0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
19600 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19610 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
19620 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
19630 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
19640 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19650 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
19660 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
19670 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
19680 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
19690 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
196a0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
196b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
196c0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
196d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
196e0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
196f0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
19700 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
19710 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
19720 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
19730 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
19740 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
19750 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
19760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
19770 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
19780 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
19790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
197a0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
197b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
197c0 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c  !pPager->pAll ||
197d0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
197e0 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65  veMode );.    re
197f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
19800 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19810 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
19820 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
19830 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
19840 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
19850 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
19860 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
19870 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
19880 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
19890 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
198a0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
198b0 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
198c0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
198d0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
198e0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
198f0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
19900 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
19910 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
19920 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
19930 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
19940 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
19950 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
19960 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
19970 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19980 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
19990 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
199a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
199b0 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a  age *pPg){..  /*
199c0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
199d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
199e0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
199f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
19a00 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
19a10 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
19a20 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45  NFO(pPg);..  CHE
19a30 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
19a40 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
19a50 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
19a60 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
19a70 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
19a80 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
19a90 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
19aa0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
19ab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
19ac0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
19ad0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
19ae0 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
19af0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
19b00 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a  >pNextFree = 0;.
19b10 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
19b20 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61  ee = pPager->pLa
19b30 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
19b40 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  pLast = pPg;.   
19b50 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
19b60 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
19b70 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
19b80 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20  xtFree = pPg;.  
19b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19ba0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
19bb0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
19bc0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
19bd0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
19be0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29  FirstSynced==0 )
19bf0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19c00 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
19c10 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
19c20 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
19c30 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
19c40 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
19c50 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  or(pPg, pPager->
19c60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
19c70 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
19c80 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
19c90 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
19ca0 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
19cb0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
19cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19cd0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
19ce0 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
19cf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
19d00 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
19d10 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
19d20 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65  0 && (!pPager->e
19d30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
19d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19d50 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70  ff>0) ){.      p
19d60 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
19d70 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
19d80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19da0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
19db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19dc0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
19dd0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
19de0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
19df0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
19e00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19e10 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
19e20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19e30 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
19e40 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
19e50 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
19e60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
19e70 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
19e80 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
19e90 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
19ea0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19eb0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
19ec0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
19ed0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
19ee0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
19ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19f00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19f10 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
19f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19f30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
19f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19f50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
19f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19f70 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
19f80 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
19f90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
19fa0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
19fb0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
19fc0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
19fd0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
19fe0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
19ff0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1a000 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
1a020 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1a030 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1a040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1a050 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
1a060 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
1a070 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1a0a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1a0b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
1a0c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1a0d0 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61  er->jfd );.  pPa
1a0e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1a0f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1a100 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
1a110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1a120 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
1a130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a140 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a150 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
1a160 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1a170 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1a180 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  l);.    }.    go
1a190 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1a1a0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1a1b0 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
1a1c0 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
1a1d0 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
1a1e0 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
1a1f0 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
1a200 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1a210 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
1a220 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
1a230 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
1a240 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44  >jfd, pPager->zD
1a250 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61  irectory);.  pPa
1a260 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a270 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
1a280 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1a290 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
1a2a0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
1a2b0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1a2c0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
1a2d0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
1a2e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1a2f0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
1a300 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1a310 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1a320 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1a330 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1a340 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1a350 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
1a360 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1a370 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
1a380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1a390 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
1a3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a3b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a3c0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
1a3d0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
1a3e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1a3f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
1a400 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  M ){.    rc = pa
1a410 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1a420 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
1a430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1a450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1a460 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a470 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
1a480 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
1a490 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
1a4a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
1a4b0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1a4c0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1a4d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a4e0 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1a4f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1a500 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1a510 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1a520 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1a530 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1a540 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1a550 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1a560 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1a570 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1a580 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1a590 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1a5a0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1a5b0 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1a5c0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1a5d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1a5e0 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1a5f0 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1a600 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1a610 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1a620 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1a630 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1a640 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1a650 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1a660 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1a670 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1a680 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1a690 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1a6a0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1a6b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a6c0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1a6d0 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1a6e0 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1a6f0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1a700 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a710 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1a720 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1a730 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1a740 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1a750 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1a760 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1a770 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1a780 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1a790 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1a7a0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1a7b0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1a7c0 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1a7d0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1a7e0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1a7f0 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1a800 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1a810 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1a820 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1a830 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1a840 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1a850 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1a860 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1a870 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1a880 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1a890 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1a8a0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1a8b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1a8c0 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1a8d0 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1a8e0 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1a8f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1a900 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1a910 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1a920 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1a930 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1a940 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1a950 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1a960 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1a970 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1a980 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1a990 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1a9a0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1a9b0 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1a9c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a9d0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1a9e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1a9f0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1aa00 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1aa10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1aa20 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1aa30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1aa40 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1aa50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1aa60 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1aa70 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
1aa80 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1aa90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1aaa0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1aab0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1aac0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1aad0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1aae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1aaf0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1ab00 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
1ab10 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
1ab20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1ab40 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1ab50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
1ab60 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
1ab70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
1ab80 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1ab90 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1aba0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1abb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1abc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
1abd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1abe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1abf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1ac00 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1ac10 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
1ac20 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
1ac30 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1ac40 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ac50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ac60 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
1ac70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ac80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ac90 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1aca0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1acb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1acc0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1acd0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1ace0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1acf0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1ad00 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1ad10 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1ad20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1ad30 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a   mode last.    *
1ad40 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
1ad50 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
1ad60 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
1ad70 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
1ad80 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
1ad90 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
1ada0 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
1adb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1adc0 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
1add0 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75  ept open and tru
1ade0 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
1adf0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
1ae00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1ae10 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
1ae20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
1ae30 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  gDbSize==0 );.  
1ae40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ae50 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1ae60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1ae70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1ae80 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1ae90 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1aea0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1aeb0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1aec0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  1 );.    if( !pP
1aed0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1aee0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1aef0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1af00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1af10 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1af20 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1af30 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  e;.      rc = wr
1af40 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1af50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1af60 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1af70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1af80 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1af90 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
1afa0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
1afb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1afc0 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
1afd0 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
1afe0 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
1aff0 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
1b000 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
1b010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1b020 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
1b030 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1b040 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dirty==0 ){.    
1b050 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1b060 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
1b070 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1b080 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1b090 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74   = pPager->pDirt
1b0a0 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  y;.    if( pPage
1b0b0 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  r->pDirty ){.   
1b0c0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1b0d0 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1b0e0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
1b0f0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  Pg->pPrevDirty =
1b100 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1b110 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
1b120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1b130 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
1b140 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
1b150 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
1b160 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
1b170 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
1b180 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1b190 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
1b1a0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1b1b0 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d  irty ){.    pPg-
1b1c0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1b1d0 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20  if( pPg->pDirty 
1b1e0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  ){.      pPg->pD
1b1f0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
1b200 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
1b210 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
1b220 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
1b230 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
1b240 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
1b250 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
1b260 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b270 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
1b280 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
1b290 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
1b2a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
1b2b0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
1b2c0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
1b2d0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1b2e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
1b2f0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
1b300 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
1b310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
1b320 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
1b330 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
1b340 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
1b350 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1b360 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1b370 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
1b380 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
1b390 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
1b3a0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
1b3b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1b3c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1b3d0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
1b3e0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
1b3f0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
1b400 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b410 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
1b420 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
1b430 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
1b440 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
1b450 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
1b460 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
1b470 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
1b480 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
1b490 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1b4a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
1b4b0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1b4c0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
1b4d0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
1b4e0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
1b4f0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
1b500 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b510 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
1b520 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
1b530 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
1b540 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
1b550 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
1b560 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
1b570 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
1b580 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
1b590 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1b5a0 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  Commit() or sqli
1b5b0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1b5c0 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
1b5d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b5e0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
1b5f0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
1b600 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
1b610 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67  DATA(pPg);.  Pag
1b620 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b630 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1b640 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b650 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1b660 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1b670 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1b680 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1b690 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b6a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b6b0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1b6c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b6d0 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1b6e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1b6f0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1b700 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1b710 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1b720 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1b730 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1b740 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1b750 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1b760 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1b770 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1b780 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1b790 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1b7a0 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1b7b0 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1b7c0 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1b7d0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1b7e0 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1b7f0 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1b800 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1b810 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1b820 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1b830 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1b840 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1b850 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1b860 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1b870 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1b880 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1b890 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1b8a0 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1b8b0 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1b8c0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  /.  if( pPg->nee
1b8d0 64 52 65 61 64 20 29 7b 0a 20 20 20 20 72 63 20  dRead ){.    rc 
1b8e0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61  = readDbPage(pPa
1b8f0 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70  ger, pPg, pPg->p
1b900 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1b910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b920 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
1b930 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ad = 0;.    }els
1b940 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1b950 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
1b960 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1b970 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
1b980 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
1b990 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1b9a0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
1b9b0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
1b9c0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
1b9d0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
1b9e0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1b9f0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1ba00 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65   && (pageInState
1ba10 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61  ment(pPg) || pPa
1ba20 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
1ba30 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
1ba40 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1ba50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1ba60 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1ba70 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1ba80 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1ba90 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1baa0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1bab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1bac0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1bad0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1bae0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1baf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1bb00 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1bb10 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1bb20 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1bb30 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1bb40 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1bb50 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1bb60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bb70 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1bb80 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1bb90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1bba0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1bbb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bbc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1bbd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1bbe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bbf0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bc00 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1bc10 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1bc20 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1bc30 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
1bc40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1bc50 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1bc60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1bc70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bc80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1bc90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1bca0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bcb0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
1bcc0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
1bcd0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1bce0 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
1bcf0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1bd00 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
1bd10 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
1bd20 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
1bd30 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1bd40 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1bd50 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1bd60 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
1bd70 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
1bd80 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
1bd90 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
1bda0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1bdb0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1bdc0 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
1bdd0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
1bde0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1bdf0 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
1be00 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
1be10 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1be20 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1be30 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
1be40 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
1be50 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
1be60 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1be70 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1be80 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1be90 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1bea0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
1beb0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1bec0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1bed0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1bee0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1bef0 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
1bf00 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1bf10 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
1bf20 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
1bf30 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1bf40 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1bf50 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
1bf60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1bf70 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
1bf80 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1bf90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1bfa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1bfb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1bfc0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1bfd0 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  m, saved;.      
1bfe0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1bff0 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20  , *pEnd;.       
1c000 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1c010 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1c020 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c030 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1c040 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1c050 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
1c060 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
1c070 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
1c080 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
1c090 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1c0a0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
1c0b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1c0c0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1c0d0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1c0e0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1c0f0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1c100 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1c110 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
1c120 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
1c130 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
1c140 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
1c150 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32     pEnd = pData2
1c160 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
1c170 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
1c180 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20  Data2 -= 4;.    
1c190 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
1c1a0 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20  u32*)pEnd;.     
1c1b0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1c1c0 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  End, cksum);.   
1c1d0 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
1c1e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
1c1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1c200 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1c210 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1c220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c230 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c240 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50  jfd, pData2, szP
1c250 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  g);.          IO
1c260 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1c270 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1c280 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1c290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c2a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c2b0 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b  rnalOff, szPg));
1c2c0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1c2d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1c2e0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1c2f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1c300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c310 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
1c320 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c330 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c340 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1c350 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c360 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c370 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1c380 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
1c390 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1c3a0 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1c3b0 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  ..  /* An error 
1c3c0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
1c3d0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
1c3e0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
1c3f0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1c400 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
1c410 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
1c420 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
1c430 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1c440 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c460 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1c480 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c490 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1c4a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c4b0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1c4c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
1c4d0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1c4e0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1c4f0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1c500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
1c510 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1c520 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1c530 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1c540 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1c560 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1c570 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1c580 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1c590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c5a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c5b0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
1c5c0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
1c5d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1c5e0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1c5f0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41  Sync;.        PA
1c600 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
1c610 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
1c620 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1c640 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c650 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1c660 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
1c670 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
1c680 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1c690 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1c6a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1c6b0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
1c6c0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1c6d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
1c6e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1c6f0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
1c700 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1c710 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
1c720 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
1c730 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
1c740 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1c750 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
1c760 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
1c770 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
1c780 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
1c790 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
1c7a0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
1c7b0 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
1c7c0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
1c7d0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
1c7e0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1c7f0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1c800 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
1c810 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
1c820 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
1c830 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1c840 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
1c850 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1c860 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1c870 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1c880 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1c890 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
1c8a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1c8b0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1c8c0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1c8d0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1c8e0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
1c8f0 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
1c900 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1c910 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
1c920 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
1c930 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1c940 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c950 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
1c960 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1c970 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
1c980 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1c990 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1c9a0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
1c9b0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1c9c0 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1c9d0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c9e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c9f0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1ca00 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1ca10 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1ca20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ca30 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1ca40 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1ca50 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1ca60 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20  pgno, 7)-4;.    
1ca70 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
1ca80 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
1ca90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1caa0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1cab0 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74  ager->stfd, pDat
1cac0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1cad0 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20  Size+4);.       
1cae0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
1caf0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1cb00 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1cb10 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1cb20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
1cb30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1cb50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1cb60 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1cb70 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
1cb80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1cb90 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
1cba0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1cbb0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1cbc0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1cbd0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1cbe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cbf0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1cc00 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1cc10 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1cc20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1cc30 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1cc40 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1cc50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1cc60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1cc70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1cc80 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1cc90 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1cca0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1ccb0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1ccc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ccd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1cce0 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1ccf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1cd00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1cd10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1cd20 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1cd30 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1cd40 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1cd50 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1cd60 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1cd70 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1cd80 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1cd90 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1cda0 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1cdb0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1cdc0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1cdd0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1cde0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1cdf0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1ce00 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1ce10 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1ce20 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1ce30 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1ce40 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1ce50 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1ce60 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1ce70 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1ce80 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1ce90 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1cea0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1ceb0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1cec0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1ced0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1cee0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1cef0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
1cf00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1cf10 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1cf20 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1cf30 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1cf40 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
1cf50 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
1cf60 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1cf70 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
1cf80 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d  ze);..  if( !MEM
1cf90 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65  DB && nPagePerSe
1cfa0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
1cfb0 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
1cfc0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1cfd0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1cfe0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
1cff0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
1d000 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1d010 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
1d020 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1d030 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1d040 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
1d050 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1d060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d070 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
1d080 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
1d090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
1d0a0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1d0b0 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
1d0c0 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
1d0d0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
1d0e0 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
1d0f0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
1d100 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
1d110 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
1d120 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
1d130 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
1d140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d150 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1d160 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1d170 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1d180 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1d190 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1d1a0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1d1b0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1d1c0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1d1d0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1d1e0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1d1f0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1d200 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1d210 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1d220 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1d230 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1d240 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1d250 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1d260 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1d270 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1d280 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
1d290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1d2a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1d2b0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1d2c0 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
1d2d0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1d2e0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
1d2f0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
1d300 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
1d310 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
1d320 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1d330 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
1d340 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
1d350 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
1d360 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
1d370 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d380 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
1d390 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
1d3a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
1d3b0 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
1d3c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
1d3d0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
1d3e0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
1d3f0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
1d400 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
1d410 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ii;.      if( !p
1d420 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1d430 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67  l || pg==pPg->pg
1d440 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  no || .         
1d450 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67   pg>pPager->orig
1d460 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67  DbSize || !(pPag
1d470 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1d480 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29  g/8]&(1<<(pg&7))
1d490 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20  ).      ) {.    
1d4a0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
1d4b0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1d4c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1d4d0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
1d4e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d4f0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1d500 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
1d510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d530 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d540 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
1d550 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1d560 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d570 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1d580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d5a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d5b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
1d5c0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1d5d0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
1d5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1d5f0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
1d600 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1d610 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d620 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1d630 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
1d640 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
1d650 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
1d660 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
1d670 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
1d680 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1d690 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
1d6a0 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
1d6b0 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
1d6c0 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
1d6d0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1d6e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1d6f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
1d700 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1d710 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
1d720 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1d730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
1d740 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  CUUM./*.** Repla
1d750 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
1d760 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
1d770 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
1d780 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
1d790 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
1d7a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1d7b0 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65  erOverwrite(Page
1d7c0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1d7d0 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74  pgno, void *pDat
1d7e0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1d7f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1d800 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d810 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
1d820 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
1d830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d850 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1d860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d880 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61  memcpy(sqlite3Pa
1d890 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c  gerGetData(pPg),
1d8a0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1d8b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
1d8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1d8d0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  rUnref(pPg);.  }
1d8e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d8f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1d900 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1d910 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1d920 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
1d930 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1d940 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
1d950 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
1d960 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
1d970 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
1d980 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
1d990 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
1d9a0 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
1d9b0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
1d9c0 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
1d9d0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1d9e0 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
1d9f0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
1da00 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
1da10 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
1da20 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
1da30 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
1da40 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
1da50 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
1da60 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
1da70 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
1da80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
1da90 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
1daa0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
1dab0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  ontRollback() be
1dac0 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
1dad0 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
1dae0 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
1daf0 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
1db00 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
1db10 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
1db20 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
1db30 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1db40 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
1db50 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
1db60 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
1db70 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
1db80 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
1db90 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1dba0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1dbb0 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1dbc0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1dbd0 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1dbe0 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1dbf0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1dc00 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1dc10 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1dc20 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1dc30 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1dc40 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1dc50 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1dc60 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1dc70 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1dc80 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1dc90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1dca0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1dcb0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1dcc0 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1dcd0 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1dce0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1dcf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dd00 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1dd10 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  d,.** the sqlite
1dd20 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1dd30 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
1dd40 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
1dd50 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ause the.** page
1dd60 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63   contains critic
1dd70 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
1dd80 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
1dd90 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c  e it gets.** rol
1dda0 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
1ddb0 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
1ddc0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1ddd0 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
1dde0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1ddf0 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
1de00 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
1de10 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1de20 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1de30 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1de40 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
1de50 72 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e 61  return;.  pPg->a
1de60 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1de70 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1de80 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1de90 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1dea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1deb0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1dec0 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1ded0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1dee0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1def0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1df00 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1df10 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1df20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1df30 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1df40 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1df50 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1df60 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1df70 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1df80 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1df90 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1dfa0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1dfb0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1dfc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1dfd0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1dfe0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1dff0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1e000 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1e010 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1e020 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1e030 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1e040 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1e050 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1e060 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1e070 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1e080 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1e090 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1e0a0 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1e0b0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1e0c0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1e0d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1e0e0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1e0f0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1e100 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1e110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e120 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1e130 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1e140 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1e150 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1e160 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
1e170 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
1e180 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1e190 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
1e1a0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1e1b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1e1c0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1e1d0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1e1e0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1e1f0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1e200 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1e210 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1e220 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1e230 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1e240 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1e250 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1e260 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1e270 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1e280 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1e290 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1e2a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1e2b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1e2c0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1e2d0 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1e2e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e2f0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
1e300 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
1e310 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
1e320 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
1e330 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
1e340 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1e350 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
1e360 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
1e370 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
1e380 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
1e390 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
1e3a0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1e3b0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1e3c0 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
1e3d0 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
1e3e0 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
1e3f0 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
1e400 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e410 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
1e420 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1e430 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1e440 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ger;..  assert( 
1e450 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1e460 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1e470 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1e480 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
1e490 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1e4a0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1e4b0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
1e4c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
1e4d0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1e4e0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1e4f0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
1e500 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1e510 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1e520 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e530 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1e540 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1e550 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
1e560 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1e570 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1e580 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1e590 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 1;.    pPg->n
1e5a0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1e5b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1e5c0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1e5d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1e5e0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1e5f0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1e600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
1e610 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
1e620 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1e630 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1e640 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1e650 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
1e660 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
1e670 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1e680 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
1e690 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e6a0 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70 61  InUse .   && !pa
1e6b0 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
1e6c0 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70  g) .   && (int)p
1e6d0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1e6e0 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b  ->stmtSize .  ){
1e6f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e700 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
1e710 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
1e720 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e730 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e740 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1e750 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1e760 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1e770 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1e780 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a  g->pgno&7);.  }.
1e790 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1e7a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e7b0 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
1e7c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e7d0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
1e7e0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
1e7f0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
1e800 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
1e810 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
1e820 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1e830 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e840 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1e850 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e860 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1e870 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1e880 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1e890 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
1e8a0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1e8b0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1e8c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e8d0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1e8e0 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
1e8f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e900 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1e910 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
1e920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e930 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
1e940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e950 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20  eturn rc;.  .   
1e960 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1e970 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1e980 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
1e990 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72  ange_counter = r
1e9a0 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
1e9b0 67 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20  gHdr, 24);.  .  
1e9c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1e9d0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1e9e0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1e9f0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1ea00 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
1ea10 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
1ea20 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1ea30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ea40 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
1ea50 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  e_counter);.    
1ea60 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
1ea70 6f 75 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63 6f  ount = change_co
1ea80 75 6e 74 65 72 3b 0a 20 20 0a 20 20 20 20 2f 2a  unter;.  .    /*
1ea90 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1eaa0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1eab0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1eac0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
1ead0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
1eae0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
1eaf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1eb00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1eb10 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1eb20 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1eb30 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
1eb40 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
1eb50 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
1eb60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1eb70 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1eb80 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1eb90 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
1eba0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1ebb0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
1ebc0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
1ebd0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
1ebe0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
1ebf0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
1ec00 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1ec10 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
1ec20 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
1ec30 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1ec40 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
1ec50 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
1ec60 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
1ec70 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
1ec80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ec90 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
1eca0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
1ecb0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
1ecc0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1ecd0 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
1ece0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ecf0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
1ed00 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
1ed10 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
1ed20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
1ed30 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
1ed40 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
1ed50 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
1ed60 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
1ed70 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
1ed80 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1ed90 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1eda0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1edb0 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1edc0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1edd0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1ede0 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1edf0 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1ee00 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1ee10 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1ee20 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
1ee30 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61  ommitPhaseOne(Pa
1ee40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
1ee50 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1ee60 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a  , Pgno nTrunc){.
1ee70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ee80 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52  E_OK;..  PAGERTR
1ee90 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1eea0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1eeb0 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1eec0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1eed0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1eee0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1eef0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1ef00 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1ef10 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1ef20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1ef30 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1ef40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1ef50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1ef60 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1ef70 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1ef80 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1ef90 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1efa0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1efb0 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1efc0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1efd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1efe0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1eff0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1f000 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f010 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1f020 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1f030 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1f040 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1f050 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1f060 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1f070 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1f080 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1f090 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1f0a0 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1f0b0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1f0c0 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1f0d0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1f0e0 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1f0f0 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1f100 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1f110 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1f120 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1f130 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1f140 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1f150 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1f160 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1f170 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f180 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1f190 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1f1a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f1b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f1c0 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1f1d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f1e0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1f1f0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1f200 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1f210 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f220 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1f230 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1f240 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1f250 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1f260 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1f270 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1f280 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1f290 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1f2a0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1f2b0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1f2c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53  ;.        int iS
1f2d0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
1f2e0 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20  GNO(pPager);.   
1f2f0 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
1f300 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
1f310 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
1f320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1f330 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ( !(pPager->aInJ
1f340 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31  ournal[i/8] & (1
1f350 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d  <<(i&7))) && i!=
1f360 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
1f370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f380 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1f390 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
1f3a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f3b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f3c0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f3d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f3e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f3f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1f400 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f410 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1f420 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f430 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1f440 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1f450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1f460 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f470 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1f480 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1f490 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1f4a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f4b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1f4c0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1f4d0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1f4e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1f4f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f500 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f510 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1f520 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f530 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1f540 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1f550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f560 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
1f570 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1f580 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f590 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1f5a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
1f5b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
1f5c0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
1f5d0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1f5e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1f5f0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
1f600 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
1f610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
1f620 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1f630 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
1f640 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f650 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f660 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  xit;.    pPager-
1f670 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20  >pDirty = 0;..  
1f680 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
1f690 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1f6a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1f6b0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1f6c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1f6d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1f6e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  0);.    }.    IO
1f6f0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
1f700 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
1f710 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1f720 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
1f730 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
1f740 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
1f750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1f760 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1f770 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1f780 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
1f790 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
1f7a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
1f7b0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
1f7c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1f7d0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1f7e0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
1f7f0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
1f800 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
1f810 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
1f820 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
1f830 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1f840 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1f850 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
1f860 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
1f870 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
1f880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1f890 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1f8a0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
1f8b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
1f8c0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
1f8d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f8e0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
1f8f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1f900 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1f910 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
1f920 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
1f930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f940 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54  OR;.  }.  PAGERT
1f950 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
1f960 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1f970 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1f980 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
1f990 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1f9a0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1f9b0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
1f9c0 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  g ){.      PgHis
1f9d0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1f9e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1f9f0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1fa00 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1fa10 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  st);.      pPg->
1fa20 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1fa30 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1fa40 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
1fa50 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1fa60 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1fa70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  c = 0;.      pHi
1fa80 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
1fa90 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
1faa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
1fab0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1fac0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1fad0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  >pDirty = 0;.#if
1fae0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1faf0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1fb00 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1fb10 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1fb20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1fb30 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1fb40 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1fb50 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1fb60 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1fb70 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1fb80 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1fb90 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1fba0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1fbb0 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1fbc0 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1fbd0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1fbe0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1fbf0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1fc00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fc10 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1fc20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1fc30 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1fc40 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
1fc50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fc60 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1fc70 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72  YNCED || !pPager
1fc80 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
1fc90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1fca0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1fcb0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
1fcc0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1fcd0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
1fce0 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
1fcf0 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
1fd00 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
1fd10 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
1fd20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
1fd30 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
1fd40 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
1fd50 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
1fd60 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
1fd70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
1fd80 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
1fd90 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1fda0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
1fdb0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1fdc0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
1fdd0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
1fde0 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
1fdf0 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
1fe00 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1fe10 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
1fe20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1fe30 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
1fe40 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
1fe50 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
1fe60 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
1fe70 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
1fe80 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
1fe90 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
1fea0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
1feb0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
1fec0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
1fed0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1fee0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1fef0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ff00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ff10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
1ff20 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
1ff30 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1ff40 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1ff50 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
1ff60 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1ff70 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
1ff80 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
1ff90 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
1ffa0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
1ffb0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
1ffc0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1ffd0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
1ffe0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
1fff0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
20000 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
20010 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
20020 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
20030 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
20040 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
20050 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
20060 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
20070 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
20080 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
20090 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
200a0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
200b0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
200c0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
200d0 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
200e0 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
200f0 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
20100 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
20110 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
20120 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
20130 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
20140 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
20150 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
20160 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
20170 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
20180 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
20190 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
201a0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
201b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
201c0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
201d0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
201e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
201f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
20200 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
20210 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  t = 0;.      pHi
20220 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
20230 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
20240 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
20250 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
20260 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
20270 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
20280 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20290 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
202a0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
202b0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
202c0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
202d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
202e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
202f0 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70  rigDbSize;.    p
20300 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
20310 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
20320 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20330 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
20340 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
20350 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
20360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20370 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
20380 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
20390 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
203a0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
203b0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
203c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
203d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
203e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
203f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
20400 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
20410 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
20420 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
20430 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
20440 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
20450 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
20460 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
20470 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
20480 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
20490 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
204a0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
204b0 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
204c0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
204d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
204e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20  er, 0);.    rc2 
204f0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
20500 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
20510 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20530 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
20540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20550 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
20560 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
20570 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65  .  /* pager_rese
20580 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  t(pPager); */.  
20590 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
205a0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
205b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
205c0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
205d0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
205e0 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
205f0 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
20600 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
20610 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
20620 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
20630 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
20640 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
20650 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
20660 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
20670 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
20680 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
20690 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
206a0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
206b0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
206c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
206d0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
206e0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
206f0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
20700 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
20710 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
20720 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
20730 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20740 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20750 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20760 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
20770 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
20780 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20790 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
207a0 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
207b0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
207c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
207d0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
207e0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
207f0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
20800 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
20810 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
20820 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
20830 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
20840 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
20850 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
20860 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
20870 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
20880 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
20890 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
208a0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
208b0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
208c0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
208d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
208e0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
208f0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
20900 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
20910 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
20920 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
20930 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
20940 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
20950 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
20960 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
20970 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
20980 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
20990 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
209a0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
209b0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
209c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
209d0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
209e0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
209f0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
20a00 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
20a10 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
20a20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
20a30 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
20a40 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
20a50 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
20a60 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
20a70 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
20a80 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
20a90 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
20aa0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20ab0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
20ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20ad0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
20ae0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
20af0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
20b00 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
20b10 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
20b20 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
20b30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20b40 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
20b50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20b60 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20b70 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
20b80 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
20b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20ba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
20bb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20bc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20bd0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
20be0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20bf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
20c00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
20c10 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
20c20 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
20c30 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
20c40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
20c50 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
20c60 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
20c70 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
20c80 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
20c90 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
20ca0 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
20cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20cc0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
20cd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20ce0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
20cf0 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
20d00 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
20d10 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
20d20 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
20d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20d40 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
20d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20d60 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
20d70 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
20d80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20d90 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
20da0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
20db0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
20dc0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
20dd0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
20de0 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
20df0 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
20e00 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
20e10 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
20e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
20e30 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73  ntemp(&pPager->s
20e40 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
20e50 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
20e60 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
20e70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
20e80 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20e90 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
20ea0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
20eb0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
20ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20ed0 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
20ee0 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
20ef0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
20f00 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
20f10 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
20f20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
20f30 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
20f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20f50 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
20f60 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
20f70 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
20f80 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
20f90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
20fa0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20fb0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
20fc0 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52  pNext;.    PAGER
20fd0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
20fe0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
20ff0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
21000 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
21010 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
21020 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
21030 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
21040 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
21050 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
21060 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
21070 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
21080 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
21090 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
210a0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
210b0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
210c0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
210d0 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
210e0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
210f0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
21100 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
21110 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
21120 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
21130 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
21140 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
21150 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
21160 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
21170 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
21180 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
21190 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
211a0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
211b0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
211c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
211d0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
211e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
211f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
21200 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
21210 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
21220 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
21230 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
21240 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
21250 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
21260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21270 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
21280 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
21290 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
212a0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
212b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
212c0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
212d0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
212e0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
212f0 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
21300 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21310 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
21320 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
21330 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
21340 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
21350 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ist;.      for(p
21360 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
21370 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74  ; pPg; pPg=pHist
21380 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
21390 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
213a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
213b0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
213c0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
213d0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
213e0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
213f0 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
21400 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
21410 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21420 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
21430 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
21440 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
21450 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
21460 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21470 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
21480 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
21490 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67  tSize;.      pag
214a0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
214b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
214c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
214d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
214e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
214f0 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
21500 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
21510 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
21520 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
21530 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
21540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21550 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21560 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
21570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21580 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
21590 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
215a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
215b0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
215c0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
215d0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
215e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
215f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
21600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21610 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
21620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21630 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21640 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
21650 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
21660 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21670 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
21680 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
21690 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
216a0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
216b0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
216c0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
216d0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
216e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
216f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21700 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
21710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
21720 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
21730 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
21740 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
21750 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
21760 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
21770 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
21780 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
21790 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
217a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
217b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
217c0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
217d0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
217e0 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
217f0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
21800 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
21810 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
21820 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
21830 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
21840 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
21850 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
21860 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
21870 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
21880 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
21890 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
218a0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
218b0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
218c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
218d0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
218e0 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  e the page ident
218f0 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74  ified by pData t
21900 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
21910 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a  in the file. .**
21920 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
21930 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
21940 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
21950 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72  age pgno. If cur
21960 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e  rent page.** pgn
21970 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
21980 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
21990 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
219a0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72  not written ther
219b0 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20  e by.** by this 
219c0 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d  routine. The sam
219d0 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  e applies to the
219e0 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65   page pData refe
219f0 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74  rs to on entry t
21a00 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
21a10 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
21a20 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
21a30 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44  refered to by pD
21a40 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  ata remain valid
21a50 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
21a60 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
21a70 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21a80 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74   pData (i.e. dat
21a90 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
21aa0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
21ab0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
21ac0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
21ad0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
21ae0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
21af0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
21b00 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
21b10 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
21b20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
21b30 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
21b40 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
21b50 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
21b60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
21b70 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
21b80 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
21b90 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
21ba0 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
21bb0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
21bc0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
21bd0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
21be0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
21bf0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
21c00 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
21c10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
21c20 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
21c30 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
21c40 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68  pPgOld; .  int h
21c50 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
21c60 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  cPgno = 0;..  as
21c70 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
21c80 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  0 );..  PAGERTRA
21c90 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
21ca0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
21cb0 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
21cc0 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
21cd0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21ce0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
21cf0 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f  ync, pgno);.  IO
21d00 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
21d10 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
21d20 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
21d30 6f 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e  o))..  if( pPg->
21d40 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
21d50 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
21d60 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
21d70 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
21d80 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
21d90 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  rt( pPg->dirty )
21da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21db0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
21dc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
21dd0 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
21de0 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20   hash-chain */. 
21df0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
21e00 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a  (pPager, pPg);..
21e10 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
21e20 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
21e30 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
21e40 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
21e50 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27  it.  ** from it'
21e60 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
21e70 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
21e80 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
21e90 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
21ea0 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
21eb0 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
21ec0 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
21ed0 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
21ee0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
21ef0 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
21f00 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
21f10 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
21f20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
21f30 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
21f40 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
21f50 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
21f60 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
21f70 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
21f80 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
21f90 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64  ;.    if( pPgOld
21fa0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
21fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
21fc0 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  ld->inJournal );
21fd0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
21fe0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
21ff0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
22000 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
22010 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
22020 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nc );.    }.  }.
22030 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
22040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
22050 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
22060 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
22070 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
22080 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
22090 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
220a0 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
220b0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
220c0 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
220d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
220e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
220f0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
22100 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
22110 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
22120 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
22130 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
22140 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
22150 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
22160 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
22170 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
22180 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
22190 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
221a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
221b0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
221c0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
221d0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
221e0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
221f0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
22200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
22210 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
22220 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
22230 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
22240 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
22250 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
22260 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
22270 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
22280 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
22290 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
222a0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
222b0 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
222c0 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
222d0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
222e0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
222f0 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
22300 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22310 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
22320 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
22330 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
22340 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
22350 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
22360 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
22370 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
22380 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
22390 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
223a0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
223b0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
223c0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
223d0 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
223e0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
223f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
22400 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
22410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
22420 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
22430 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
22440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22450 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
22460 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
22470 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
22480 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
22490 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
224a0 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
224b0 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
224c0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
224d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
224e0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
224f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22500 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
22510 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22520 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
22530 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
22540 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
22550 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
22560 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
22570 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g){.  return PGH
22580 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
22590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
225a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
225b0 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
225c0 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
225d0 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
225e0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
225f0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
22600 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
22610 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
22620 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22630 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22640 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22650 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50  return (pPager?P
22660 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
22670 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d  g, pPager):0);.}
22680 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
22690 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
226a0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
226b0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
226c0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
226d0 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
226e0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
226f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
22700 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
22710 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
22720 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
22730 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
22740 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
22750 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
22760 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
22770 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
22780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
22790 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
227a0 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
227b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
227c0 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
227d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
227e0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
227f0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
22800 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
22810 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
22820 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
22830 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
22840 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
22850 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
22860 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
22870 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
22880 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
22890 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
228a0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
228b0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
228c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
228d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
228e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
228f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
22900 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
22910 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
22920 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
22930 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
22940 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
22950 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
22960 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
22970 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
22980 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
22990 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
229a0 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
229b0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
229c0 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eMode;.}..#if de
229d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
229e0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
229f0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
22a00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
22a10 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
22a20 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
22a30 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
22a40 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
22a50 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
22a60 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
22a70 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
22a80 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
22a90 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
22aa0 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
22ab0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73  qlite3PagerLocks
22ac0 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
22ad0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
22ae0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
22af0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
22b00 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
22b10 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
22b20 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
22b30 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
22b40 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
22b50 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
22b60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22b70 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
22b80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
22b90 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
22ba0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
22bb0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
22bc0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
22bd0 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
22be0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
22bf0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22c00 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
22c10 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
22c20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
22c30 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
22c40 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
22c50 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
22c60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22c70 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
22c80 0a                                               .