/ Hex Artifact Content
Login

Artifact 9eeb505af0ff7abc339b6825754a884e822fa4a2:


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 34  : pager.c,v 1.34
0350: 37 20 32 30 30 37 2f 30 36 2f 31 36 20 31 38 3a  7 2007/06/16 18:
0360: 33 39 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  39:42 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 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
19b0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
19c0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
19d0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
19e0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
19f0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1a00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1a10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1a20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1a30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1a40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1a50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1a60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1a70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1a80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1a90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1aa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ab0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1ac0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1ad0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1ae0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1af0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
1b00: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
1b10: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
1b20: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
1b30: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
1b40: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
1b50: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
1b60: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
1b70: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
1b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b90: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
1ba0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
1bb0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
1bc0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
1bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1be0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
1bf0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
1c00: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c10: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
1c20: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
1c30: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
1c40: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
1c50: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
1c60: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
1c70: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
1c80: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1c90: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1ca0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
1cb0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
1cc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
1cd0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ce0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1cf0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
1d00: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
1d10: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
1d20: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
1d30: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
1d40: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
1d50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d60: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
1d70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
1d80: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
1d90: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
1da0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
1db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1dc0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
1dd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1de0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1df0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e00: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
1e10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
1e20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1e30: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
1e40: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1e50: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
1e60: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
1e70: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
1e80: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
1e90: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
1ea0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
1eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
1ed0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ee0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
1ef0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
1f00: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
1f10: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1f20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1f30: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
1f40: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
1f50: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
1f60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1f70: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
1f80: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
1fa0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
1fb0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
1fc0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1fd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
1fe0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
1ff0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2000: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2010: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2020: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2030: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2040: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2050: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2060: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2070: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2080: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2090: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
20a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
20b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
20c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
20d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
20e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
20f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2100: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2110: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2120: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2130: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2140: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2150: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2160: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2170: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2180: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2190: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
21a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
21b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
21c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
21d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
21f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2200: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2210: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2220: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2230: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2240: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2250: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2260: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2270: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2280: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2290: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
22a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
22b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
22c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
22d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
22e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
22f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2300: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2310: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2320: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2330: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2340: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2350: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2360: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2370: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2380: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2390: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
23a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
23b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
23c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
23d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
23e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
23f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2400: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2410: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2420: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2430: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2440: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2450: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2460: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2470: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2480: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2490: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
24a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
24b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
24c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
24d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
24e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
24f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2500: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2510: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2520: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2530: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2540: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2550: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2560: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2570: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2580: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2590: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
25a0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
25b0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
25c0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
25d0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
25e0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
25f0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2600: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2610: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2620: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2630: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2640: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2650: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2660: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2670: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2680: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2690: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
26a0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
26b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
26c0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
26d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
26e0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
26f0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2700: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2710: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2720: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2730: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2740: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2750: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2760: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2770: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2780: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2790: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
27a0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
27b0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
27c0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
27d0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
27e0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
27f0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2800: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2810: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
2820: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
2830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
2860: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
2870: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
2880: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
28c0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
28d0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
28e0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
28f0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
2900: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
2910: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
2920: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
2930: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
2940: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
2950: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
2960: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
2970: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
2980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2990: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
29c0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
29d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
29e0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
29f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
2a00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
2a10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
2a20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
2a30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2a40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
2a50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
2a60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
2a70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2a80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2a90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
2aa0: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
2ab0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
2ac0: 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20   u8 needRead;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  /* Read content 
2af0: 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29 20  if PagerWrite() 
2b00: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73  is called */.  s
2b10: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
2b40: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
2b50: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
2b60: 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20  , *pPrevDirty;  
2b70: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
2b80: 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65   */.  u32 notUse
2b90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ba0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73       /* Buffer s
2bb0: 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  pace */.#ifdef S
2bc0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2bd0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
2be0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2bf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
2c00: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
2c10: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
2c20: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
2c30: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
2c40: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
2c50: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
2c60: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
2c70: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
2c80: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
2c90: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
2ca0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
2cb0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
2cc0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
2cd0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
2ce0: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
2cf0: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
2d00: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
2d10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d20: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
2d30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
2d40: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
2d50: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
2d60: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
2d70: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
2d90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
2da0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2db0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2dc0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
2dd0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
2de0: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
2df0: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
2e00: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
2e10: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
2e20: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
2e30: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
2e40: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
2e50: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
2e60: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
2e70: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
2e80: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
2e90: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
2ea0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2eb0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
2ec0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
2ed0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2ee0: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2ef0: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2f00: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2f10: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2f20: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2f30: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2f40: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2f50: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f60: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2f70: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
2f80: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
2f90: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
2fa0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2fb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2fc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
2ff0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3000: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3010: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3020: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3030: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3040: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
3060: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
3070: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3080: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
3090: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
30a0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
30b0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
30c0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
30d0: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
30e0: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
30f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3100: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3110: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3120: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3130: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3140: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3150: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
3160: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
3170: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
3180: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
3190: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
31a0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
31b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
31c0: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
31d0: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
31e0: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
31f0: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
3200: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
3210: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3220: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
3230: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
3240: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
3250: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
3260: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
3270: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
3280: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
3290: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
32a0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
32b0: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
32c0: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
32d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
32e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
32f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3300: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
3310: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
3320: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
3330: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
3340: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
3350: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
3360: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
3370: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
3380: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
3390: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
33a0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
33b0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
33c0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
33d0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
33e0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
33f0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
3400: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
3410: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
3420: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
3430: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
3440: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
3450: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
3460: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
3470: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
3480: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
3490: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
34a0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
34b0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
34c0: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
34d0: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
34e0: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
34f0: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
3500: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3510: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3530: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3540: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3550: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3560: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3570: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3580: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3590: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
35b0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
35c0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
35d0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
35e0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
35f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3600: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3610: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3620: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3640: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3660: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3670: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3690: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
36a0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
36b0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
36c0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
36d0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
36e0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
36f0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3700: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3710: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3720: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3730: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3740: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3750: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3770: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3780: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3790: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
37a0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
37c0: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
37d0: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
37e0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3800: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3810: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3820: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3830: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3850: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3860: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3870: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3890: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
38a0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
38b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38d0: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
38e0: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
38f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3900: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3920: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
3930: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
3940: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
3950: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
3960: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
3970: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
3980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3990: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
39b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
39c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
39d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3a00: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3a10: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3a20: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a40: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3a50: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3a60: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3a70: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
3a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a90: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
3aa0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
3ab0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
3ac0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3ad0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3ae0: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3af0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3b00: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
3b10: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
3b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
3b50: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
3b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
3b80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
3b90: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
3bb0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
3bc0: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
3bd0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
3be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bf0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
3c00: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
3c10: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3c20: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
3c50: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
3c60: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3c70: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
3c90: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
3ca0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
3cb0: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
3cc0: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
3cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ce0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
3cf0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
3d00: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
3d10: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3d20: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3d30: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
3d40: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
3d60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d80: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
3d90: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3dc0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3dd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3e10: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
3e20: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
3e30: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
3e40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
3e50: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
3e60: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
3e70: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
3ea0: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
3eb0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3ec0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
3ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3ee0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
3ef0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
3f00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
3f10: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
3f30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
3f40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
3f50: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
3f60: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3f70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3f80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3f90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
3fa0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3fb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3fd0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3fe0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3ff0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
4000: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
4010: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
4020: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
4030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
4040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4050: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
4060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
4070: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
40a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
40b0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
40c0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
40d0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
40e0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
40f0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
4100: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
4110: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
4120: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
4130: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
4140: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
4150: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
4160: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
4170: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
4180: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
41b0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
41c0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
41d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
41e0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
41f0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
4200: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
4210: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
4220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4230: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4260: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4270: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4280: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4290: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
42a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
42b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
42c0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
42d0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
42e0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
42f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
4300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
4310: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
4320: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
4330: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4340: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4350: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4360: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4370: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4390: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
43a0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
43c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
43d0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
43e0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
43f0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
4400: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4410: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4430: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4440: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4450: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4460: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4470: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4480: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4490: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
44a0: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
44b0: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
44c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
44d0: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
44e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
44f0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4500: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4510: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4520: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4540: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4550: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4560: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4570: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4580: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4590: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
45a0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
45b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
45c0: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
45d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
45e0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4600: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4610: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4620: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4640: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4650: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4660: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4680: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4690: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
46b0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
46c0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
46d0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
46e0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4700: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4710: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4720: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4730: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4740: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4750: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4760: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4770: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4790: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
47a0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
47b0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
47c0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
47d0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
47e0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
47f0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4800: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4810: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4820: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4840: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4850: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4860: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4870: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4880: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4890: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48a0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
48b0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
48c0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
48d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
48e0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48f0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4900: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4910: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4920: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4930: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4940: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4950: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4960: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4970: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
49a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
49b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
49c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
49d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
49e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
49f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
4a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
4a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
4a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
4a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
4a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
4a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
4a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
4a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
4a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
4a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
4aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
4ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
4ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
4ad0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
4ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
4af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
4b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
4b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
4b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
4b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
4b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
4b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
4b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
4b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
4b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
4b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
4ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
4bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
4bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
4bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
4be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
4bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
4c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
4c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
4c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
4c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
4c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
4c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
4c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
4c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
4c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
4ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
4cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
4cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
4cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
4ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
4cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
4d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
4d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
4d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
4d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
4d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
4d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
4d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
4d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
4d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
4d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
4da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
4db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
4dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
4dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
4de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
4df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
4e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
4e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
4e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
4e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
4e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
4e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
4e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
4e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
4e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
4e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
4ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
4eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
4ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
4ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
4ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
4f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
4f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
4f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
4f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
4f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4f50: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
4f60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4f70: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
4f80: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
4f90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
4fa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4fb0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4fc0: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4fd0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4fe0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4ff0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5000: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
5010: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
5020: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
5030: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
5040: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
5050: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
5060: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5070: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5080: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5090: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
50a0: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
50b0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
50c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
50d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
50e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
50f0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5100: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
5110: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
5120: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
5130: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
5140: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
5150: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
5160: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5170: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5180: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5190: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
51a0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
51b0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
51c0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
51d0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
51e0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5200: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
5210: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
5220: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
5230: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
5240: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
5250: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
5260: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5270: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5280: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5290: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
52a0: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
52b0: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
52c0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
52d0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
52e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
52f0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5300: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5320: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5330: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5340: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5350: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5360: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5370: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5380: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5390: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
53a0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
53b0: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
53c0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
53d0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
53e0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
53f0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5400: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5410: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5420: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5430: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5440: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5450: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5460: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5470: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5480: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5490: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
54a0: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
54b0: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
54c0: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
54e0: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
54f0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
5500: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5510: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
5520: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
5530: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
5540: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
5550: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
5560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
5570: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
5580: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
5590: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
55a0: 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-3d total=%d\n
55b0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
55c0: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
55d0: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d  (p), p->nRef, p-
55e0: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20  >pPager->nRef.  
55f0: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
5600: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
5610: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
5620: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
5630: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
5640: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
5650: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
5660: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
5670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5680: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
5690: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
56a0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
56b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
56c0: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
56d0: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
56e0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
56f0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
5700: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
5710: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
5730: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
5740: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5750: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5760: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
5770: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74  MEMDB ){.    ret
5780: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  urn PGHDR_TO_HIS
5790: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e  T(pPg, pPager)->
57a0: 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  inStmt;.  }else{
57b0: 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
57c0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
57d0: 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e  u8 *a = pPager->
57e0: 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74  aInStmt;.    ret
57f0: 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70  urn (a && (int)p
5800: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
5810: 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f  tSize && (a[pgno
5820: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
5830: 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7))));.  }.}../*
5840: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
5850: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
5860: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
5870: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
5880: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
5890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
58a0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
58b0: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
58c0: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
58d0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
58e0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
58f0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
5900: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
5910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5920: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
5930: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
5940: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5950: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5960: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5970: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5980: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5990: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
59a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
59b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
59c0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
59d0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
59e0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
59f0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
5a00: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
5a10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
5a20: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
5a30: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
5a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5a50: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
5a60: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
5a70: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
5a80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5a90: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
5aa0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
5ab0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
5ac0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
5ad0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
5ae0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
5af0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
5b00: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
5b10: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
5b20: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
5b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
5b40: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
5b50: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
5b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
5b70: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
5b80: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
5b90: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
5ba0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5bb0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
5bc0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
5bd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5be0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5bf0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
5c00: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
5c10: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
5c20: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
5c30: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
5c40: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
5c50: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
5c60: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
5c70: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5c80: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
5c90: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
5ca0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5cb0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5cc0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5cd0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5ce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5cf0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5d00: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5d10: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5d20: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5d30: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5d40: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5d50: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5d60: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5d70: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5d80: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5d90: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5da0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5db0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5dc0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5dd0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5de0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5e00: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5e10: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5e20: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5e30: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5e40: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5e50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5e60: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5e70: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5e80: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
5e90: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
5ea0: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
5eb0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
5ec0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
5ed0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
5ee0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
5ef0: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
5f00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f10: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
5f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
5f30: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
5f40: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
5f50: 72 6e 20 73 71 6c 69 74 65 33 47 65 74 34 62 79  rn sqlite3Get4by
5f60: 74 65 28 61 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  te(ac);.}.../*.*
5f70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5f80: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
5f90: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f   when an error o
5fa0: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
5fb0: 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20   pager.** code. 
5fc0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
5fd0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
5fe0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
5ff0: 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73  ucture, the.** s
6000: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
6010: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
6020: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
6030: 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
6040: 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  n. .** The value
6050: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
6060: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
6070: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
6080: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
6090: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
60a0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
60b0: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
60c0: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53  TE_CORRUPT, or S
60d0: 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68  QLITE_FULL.** th
60e0: 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20  e error becomes 
60f0: 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20  persistent. All 
6100: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
6110: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
6120: 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64  er.** will immed
6130: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
6140: 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64  e same error cod
6150: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6160: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
6170: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
6180: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
6190: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
61a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
61b0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
61c0: 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  LL || pPager->er
61d0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
61e0: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
61f0: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
6200: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
6210: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
6220: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
6230: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
6240: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
6250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6260: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
6270: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6280: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6290: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
62a0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
62b0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
62c0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
62d0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
62e0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
62f0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6300: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
6310: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6320: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
6330: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
6340: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
6350: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
6360: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6370: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6390: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
63a0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
63b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
63c0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
63d0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
63e0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
63f0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6400: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
6410: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
6420: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
6430: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
6440: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
6450: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20  r->pageSize, .  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20        (unsigned 
6480: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
6490: 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a  DATA(pPage));.}.
64a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
64b0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
64c0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
64d0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
64e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
64f0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
6500: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
6510: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
6520: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
6530: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
6540: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
6550: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
6560: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
6570: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
6580: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
6590: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
65a0: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
65b0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
65c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
65d0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
65e0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
65f0: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
6600: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
6610: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
6620: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
6630: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
6640: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
6650: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
6660: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
6670: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
6680: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
6690: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
66a0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
66b0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
66c0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
66d0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
66e0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
66f0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
6700: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
6710: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6720: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
6730: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
6740: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
6750: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
6760: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
6770: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
6780: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
6790: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
67a0: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
67b0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
67c0: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
67d0: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
67e0: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
67f0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
6800: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
6810: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
6820: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
6830: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
6840: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
6850: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6860: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
6870: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
6880: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
6890: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
68a0: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
68b0: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
68c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
68d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
68e0: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
68f0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
6900: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
6910: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
6920: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6930: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
6940: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
6950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
6960: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
6970: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6980: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
6990: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
69a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
69b0: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
69c0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
69d0: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
69e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
69f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6a00: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6a10: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
6a20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6a30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6a40: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6a50: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
6a60: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
6a70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
6a80: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
6a90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
6aa0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
6ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ac0: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
6ad0: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
6ae0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6af0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
6b00: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
6b10: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
6b20: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
6b30: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6b50: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
6b60: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6b70: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
6b80: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6b90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6ba0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
6bb0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
6bc0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
6bd0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
6be0: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
6bf0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
6c00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
6c20: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
6c30: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
6c40: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
6c50: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
6c60: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
6c70: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
6c80: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
6c90: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
6ca0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
6cb0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
6cc0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6cd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
6ce0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
6cf0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
6d00: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
6d10: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
6d20: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
6d30: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
6d40: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
6d50: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
6d60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
6d70: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
6d80: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
6d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
6da0: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
6db0: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
6dc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6dd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
6de0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
6df0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6e00: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6e10: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
6e20: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
6e30: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
6e40: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
6e50: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
6e60: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
6e70: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
6e80: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
6e90: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
6ea0: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
6eb0: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
6ec0: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
6ed0: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6f20: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6f40: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6f60: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
6f90: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
6fa0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
6fb0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
6fc0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
6fd0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6fe0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
6ff0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
7000: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
7010: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
7020: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
7030: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
7040: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
7050: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7060: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
7070: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
7080: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
7090: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
70a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
70b0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
70c0: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
70d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
70e0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
70f0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
7100: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
7110: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
7120: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7130: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
7140: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
7150: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
7160: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
7170: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
7180: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
7190: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
71a0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
71b0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
71c0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
71d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
71e0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
71f0: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
7200: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
7210: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
7220: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
7230: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
7240: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
7250: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
7260: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
7270: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
7280: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
7290: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
72a0: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
72b0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
72c0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
72d0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
72e0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
72f0: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
7300: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
7310: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
7320: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
7330: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
7340: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
7350: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
7360: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
7370: 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64  r){.  char zHead
7380: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7390: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20  alMagic)+16];.  
73a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
73b0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
73c0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
73d0: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
73e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
73f0: 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  Off;.  }..  rc =
7400: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7410: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
7420: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7430: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7440: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
7450: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
7460: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7470: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
7480: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
7490: 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20   FIX ME: .  **. 
74a0: 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72   ** Possibly for
74b0: 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20   a pager not in 
74c0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  no-sync mode, th
74d0: 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20  e journal magic 
74e0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20  should not.  ** 
74f0: 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c  be written until
7500: 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20   nRec is filled 
7510: 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65  in as part of ne
7520: 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  xt syncJournal()
7530: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  . .  **.  ** Act
7540: 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20  ually maybe the 
7550: 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65  whole journal he
7560: 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64  ader should be d
7570: 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61  elayed until tha
7580: 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68  t.  ** point. Th
7590: 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a  ink about this..
75a0: 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48    */.  memcpy(zH
75b0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
75c0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
75d0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
75e0: 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c  /* The nRec Fiel
75f0: 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f  d. 0xFFFFFFFF fo
7600: 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61  r no-sync journa
7610: 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ls. */.  put32bi
7620: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7630: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7640: 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  )], pPager->noSy
7650: 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  nc ? 0xffffffff 
7660: 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72  : 0);.  /* The r
7670: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
7680: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
7690: 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d  .  sqlite3Random
76a0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
76b0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
76c0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
76d0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
76e0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
76f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7700: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
7710: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
7720: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
7730: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
7740: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7750: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7760: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
7770: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  >dbSize);.  /* T
7780: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
7790: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
77a0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
77b0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
77c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
77d0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
77e0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
77f0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
7800: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
7810: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
7820: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65  journalHdr, size
7830: 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20  of(zHeader))).  
7840: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7850: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7860: 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
7870: 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f  (zHeader));..  /
7880: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
7890: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
78a0: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
78b0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
78c0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
78d0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
78e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
78f0: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
7900: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
7910: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7920: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41     IOTRACE(("JTA
7930: 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  IL %p %lld\n", p
7940: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
7950: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20  ournalOff-1)).  
7960: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7970: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
7980: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
7990: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28  lOff-1);.    if(
79a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
79b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
79c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
79d0: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
79e0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
79f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7a00: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
7a10: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
7a20: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
7a30: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
7a40: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
7a50: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7a60: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
7a70: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
7a80: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
7a90: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
7aa0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
7ab0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
7ac0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
7ad0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
7ae0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
7af0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
7b00: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
7b10: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
7b20: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
7b30: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
7b40: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
7b50: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
7b60: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
7b70: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
7b80: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
7b90: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
7ba0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
7bb0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
7bc0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
7bd0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7be0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
7bf0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
7c00: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
7c10: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
7c20: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
7c30: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
7c40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
7c50: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
7c60: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
7c70: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
7c80: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
7c90: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
7ca0: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
7cb0: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
7cc0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
7cd0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
7ce0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
7cf0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
7d00: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
7d10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7d20: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
7d30: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
7d40: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
7d50: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
7d60: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
7d70: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
7d80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7d90: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
7da0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
7db0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
7dc0: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
7dd0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
7de0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
7df0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
7e00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7e10: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
7e20: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
7e30: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
7e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
7e50: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
7e60: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
7e70: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
7e80: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7e90: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
7ea0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
7eb0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
7ec0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7ed0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
7ee0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7ef0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
7f00: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7f10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7f20: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
7f30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7f40: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7f50: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  s(pPager->jfd, &
7f60: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
7f70: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
7f80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
7f90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7fa0: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a  ger->jfd, pDbSiz
7fb0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
7fc0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
7fd0: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
7fe0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
7ff0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
8000: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
8010: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
8020: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
8030: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
8040: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
8050: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
8060: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
8070: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
8080: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
8090: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
80a0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
80b0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
80c0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
80d0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
80e0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
80f0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
8100: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
8110: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
8120: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8130: 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  fd, (u32 *)&pPag
8140: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
8150: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
8160: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
8170: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8180: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8190: 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
81a0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
81b0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
81c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
81d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
81e0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
81f0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
8200: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
8210: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
8220: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
8230: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
8240: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
8250: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
8260: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
8270: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
8280: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
8290: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
82a0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
82b0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
82c0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
82d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
82e0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
82f0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
8300: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
8310: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
8320: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
8330: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
8340: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
8350: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
8360: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
8370: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8380: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
8390: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
83a0: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
83b0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
83c0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
83d0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
83e0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
83f0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
8400: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
8410: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
8420: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
8430: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
8440: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
8450: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
8460: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
8470: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
8480: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
8490: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
84a0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
84b0: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
84c0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
84d0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
84e0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
84f0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
8500: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
8510: 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61  cksum = 0;.  cha
8520: 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a  r zBuf[sizeof(aJ
8530: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34  ournalMagic)+2*4
8540: 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ];..  if( !zMast
8550: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
8560: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
8570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
8580: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8590: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
85a0: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
85b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
85c0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
85d0: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
85e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
85f0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
8600: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
8610: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
8620: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
8630: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
8640: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
8650: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
8660: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
8670: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
8680: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
8690: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
86a0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
86b0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
86c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a  {.    rc = seekJ
86d0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
86f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8700: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
8710: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
8720: 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72  = (len+20);..  r
8730: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
8740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47  pPager->jfd, PAG
8750: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
8760: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
8770: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8780: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8790: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
87a0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
87b0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
87c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
87d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74  eturn rc;..  put
87e0: 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e  32bits(zBuf, len
87f0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
8800: 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b  zBuf[4], cksum);
8810: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
8820: 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  8], aJournalMagi
8830: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
8840: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20  alMagic));.  rc 
8850: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
8860: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42  (pPager->jfd, zB
8870: 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f  uf, 8+sizeof(aJo
8880: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
8890: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
88a0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
88b0: 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nc;.  return rc;
88c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
88d0: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
88e0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
88f0: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
8900: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
8910: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
8920: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
8930: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
8940: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
8950: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
8960: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
8970: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
8980: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
8990: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
89a0: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
89b0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
89c0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
89d0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
89e0: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
89f0: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
8a00: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
8a10: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
8a20: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
8a30: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
8a40: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
8a50: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
8a60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
8a70: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
8a80: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
8a90: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
8aa0: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
8ab0: 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b  assert( MEMDB );
8ac0: 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69  .  if( !pHist->i
8ad0: 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  nStmt ){.    ass
8ae0: 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65  ert( pHist->pPre
8af0: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73  vStmt==0 && pHis
8b00: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  t->pNextStmt==0 
8b10: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
8b20: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
8b30: 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28    PGHDR_TO_HIST(
8b40: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70  pPager->pStmt, p
8b50: 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d  Pager)->pPrevStm
8b60: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
8b70: 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53     pHist->pNextS
8b80: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
8b90: 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  tmt;.    pPager-
8ba0: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
8bb0: 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
8bc0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
8bd0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
8be0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
8bf0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
8c00: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
8c10: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
8c20: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
8c30: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
8c40: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
8c50: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
8c60: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
8c70: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
8c80: 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  p;.  if( pPager-
8c90: 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75  >aHash==0 ) retu
8ca0: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67  rn 0;.  p = pPag
8cb0: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26  er->aHash[pgno &
8cc0: 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
8cd0: 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  1)];.  while( p 
8ce0: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
8cf0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
8d00: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
8d10: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
8d20: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
8d30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
8d40: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8d50: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
8d60: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
8d70: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8d80: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  eMode ){.    if(
8d90: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
8da0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8db0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
8dc0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61  LOCK);.      pPa
8dd0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
8de0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
8df0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
8e00: 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20  pPager)).    }. 
8e10: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
8e20: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
8e30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
8e40: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
8e50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ;.  }.}../*.** E
8e60: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
8e70: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
8e80: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
8e90: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
8ea0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
8eb0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
8ec0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
8ed0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a  already entered.
8ee0: 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  ** the error-sta
8ef0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
8f00: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
8f10: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
8f20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72  *p){.  if( p->er
8f30: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
8f40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
8f50: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
8f60: 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  ED || p->journal
8f70: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Open==0 );.  if(
8f80: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
8f90: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8fa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
8fb0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20  lback(p);.  }.  
8fc0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b  pager_unlock(p);
8fd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
8fe0: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75  rCode || !p->jou
8ff0: 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e  rnalOpen || (p->
9000: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21  exclusiveMode&&!
9010: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29  p->journalOff) )
9020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9030: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74  rrCode || !p->st
9040: 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63  mtOpen || p->exc
9050: 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a  lusiveMode );.}.
9060: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
9070: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
9080: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
9090: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
90a0: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
90b0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
90c0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
90d0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
90e0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
90f0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
9100: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
9110: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
9120: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
9130: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
9140: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
9150: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
9160: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
9170: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
9180: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
9190: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
91a0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
91b0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
91c0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
91d0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
91e0: 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  xt){.    IOTRACE
91f0: 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
9200: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
9210: 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47  >pgno));.    PAG
9220: 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
9230: 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
9240: 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  nt);.    pNext =
9250: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
9260: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
9270: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
9280: 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
9290: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
92a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
92b0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
92c0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
92d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
92e0: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
92f0: 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->nHash = 0;.  
9300: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
9310: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
9320: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
9330: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
9340: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
9350: 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ref = 0;.}../*.*
9360: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
9370: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
9380: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
9390: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
93a0: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
93b0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
93c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
93d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
93e0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
93f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9400: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
9410: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
9420: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
9430: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
9440: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
9450: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
9460: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
9470: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
9480: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
9490: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
94a0: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
94b0: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
94c0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
94d0: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
94e0: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
94f0: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
9500: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
9510: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
9520: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
9530: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
9540: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
9550: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
9560: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9570: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
9580: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
9590: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
95a0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
95b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
95c0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
95d0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
95e0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
95f0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
9600: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
9610: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
9620: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
9630: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
9640: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
9650: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
9660: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
9670: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
9680: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
9690: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
96a0: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
96b0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
96c0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
96d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
96e0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
96f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9700: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
9710: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
9720: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
9730: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
9740: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
9750: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
9760: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
9770: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
9780: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
9790: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
97a0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
97b0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
97c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
97d0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
97e0: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
97f0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
9800: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9810: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
9820: 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  {;.      sqlite3
9830: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
9840: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  fd, 0);.      pP
9850: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
9870: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
9880: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
9890: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
98a0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
98b0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
98c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
98d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
98e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
98f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9900: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
9910: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
9920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9930: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
9940: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
9950: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
9960: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
9970: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
9980: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
9990: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
99a0: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
99b0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
99c0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
99d0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
99e0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
99f0: 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f     pPg->alwaysRo
9a00: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64  llback = 0;.#ifd
9a10: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
9a20: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
9a30: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
9a40: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
9a50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9a60: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
9a70: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
9a80: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
9a90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
9aa0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
9ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9ac0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
9ad0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
9ae0: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
9af0: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
9b00: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
9b10: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
9b20: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
9b30: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
9b40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
9b50: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
9b60: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
9b70: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9b80: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
9b90: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
9ba0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
9bb0: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
9bc0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
9bd0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
9be0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
9bf0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
9c00: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9c10: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9c20: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9c30: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
9c40: 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
9c50: 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  First;.  pPager-
9c60: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
9c70: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
9c80: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
9c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
9ca0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
9cb0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
9cc0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
9cd0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
9ce0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
9cf0: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
9d00: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
9d10: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
9d20: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
9d30: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
9d40: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
9d50: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
9d60: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
9d70: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
9d80: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
9d90: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
9da0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
9db0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
9dc0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
9dd0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
9de0: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
9df0: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
9e00: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
9e10: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
9e20: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
9e30: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
9e40: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
9e50: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
9e60: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
9e70: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
9e80: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
9e90: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
9ea0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
9eb0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
9ec0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
9ed0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
9ee0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
9ef0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
9f00: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
9f10: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
9f20: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
9f30: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
9f40: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
9f50: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
9f60: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
9f70: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
9f80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
9f90: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
9fa0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
9fb0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
9fc0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
9fd0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
9fe0: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
9ff0: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
a000: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
a010: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
a020: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
a030: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
a040: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
a050: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
a060: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
a070: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
a080: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
a090: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
a0a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
a0b0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
a0c0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
a0d0: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
a0e0: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
a0f0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
a100: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
a110: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
a120: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
a130: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
a140: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
a150: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a160: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  cksum;.}../* For
a170: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
a180: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
a190: 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a  makeClean(PgHdr*
a1a0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  );../*.** Read a
a1b0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
a1c0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
a1d0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
a1e0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
a1f0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
a200: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
a210: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
a220: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
a230: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
a240: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
a250: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
a260: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
a270: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a280: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
a290: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
a2a0: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
a2b0: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
a2c0: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
a2d0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
a2e0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
a2f0: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
a300: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
a310: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
a320: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
a350: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
a360: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
a370: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
a380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
a390: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
a3a0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
a3b0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
a3e0: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
a3f0: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
a400: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
a410: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
a420: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
a430: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
a440: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
a450: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
a460: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
a470: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
a480: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
a490: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
a4a0: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
a4b0: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
a4c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
a4d0: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
a4e0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
a4f0: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
a500: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
a510: 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  );..  rc = read3
a520: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
a530: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a540: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
a550: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
a560: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
a570: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
a580: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
a590: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
a5a0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
a5b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a5c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a5d0: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
a5e0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
a5f0: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
a600: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
a610: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
a620: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
a630: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
a640: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
a650: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
a660: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
a670: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
a680: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
a690: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
a6a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a6b0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
a6c0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
a6d0: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
a6e0: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
a6f0: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
a700: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
a710: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
a720: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
a730: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
a740: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a750: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
a760: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
a770: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
a780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a790: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
a7a0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
a7b0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
a7c0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
a7d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a7e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
a7f0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
a800: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
a810: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
a820: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
a830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
a840: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
a850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a860: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
a870: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
a880: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
a890: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
a8a0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
a8b0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
a8c0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
a8d0: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
a8e0: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
a8f0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
a900: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
a910: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
a920: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
a930: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
a940: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
a950: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
a960: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
a970: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
a980: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
a990: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
a9a0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
a9b0: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
a9c0: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
a9d0: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
a9e0: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
a9f0: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
aa00: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
aa10: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
aa20: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
aa30: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
aa40: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
aa50: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
aa60: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
aa70: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
aa80: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
aa90: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
aaa0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
aab0: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
aac0: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
aad0: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
aae0: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
aaf0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
ab00: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
ab10: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
ab20: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
ab30: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
ab40: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
ab50: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
ab60: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
ab70: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
ab80: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
ab90: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
aba0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
abb0: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
abc0: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
abd0: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
abe0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
abf0: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
ac00: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ac10: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
ac20: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
ac30: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
ac40: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
ac50: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
ac60: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
ac70: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
ac80: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
ac90: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
aca0: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
acb0: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
acc0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
acd0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
ace0: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
acf0: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
ad00: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
ad10: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
ad20: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
ad30: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
ad40: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
ad50: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
ad60: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
ad70: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
ad80: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
ad90: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
ada0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
adb0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
adc0: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
add0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
ade0: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
adf0: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
ae00: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
ae10: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
ae20: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
ae30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
ae40: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
ae50: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
ae60: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
ae70: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
ae80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
ae90: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
aea0: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
aeb0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
aec0: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
aed0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
aee0: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
aef0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
af00: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
af10: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
af20: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
af30: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
af40: 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59  AGERTRACE4("PLAY
af50: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
af60: 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
af80: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
af90: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
afa0: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
afb0: 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20  Size, aData));. 
afc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
afd0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
afe0: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
aff0: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
b000: 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
b010: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
b020: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
b030: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
b040: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
b050: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b060: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
b070: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
b080: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
b090: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b0a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
b0b0: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
b0c0: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
b0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
b0e0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
b0f0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
b100: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
b110: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
b120: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
b130: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
b140: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
b150: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
b160: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
b170: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
b180: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
b190: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
b1a0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
b1b0: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
b1c0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
b1d0: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
b1e0: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
b1f0: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
b200: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
b210: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
b220: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
b230: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
b240: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
b250: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
b260: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
b270: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
b280: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
b290: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
b2a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
b2b0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
b2c0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
b2d0: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
b2e0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
b2f0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b300: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
b310: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
b320: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
b330: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
b340: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
b350: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
b360: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
b370: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
b380: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
b390: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
b3a0: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
b3b0: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
b3c0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
b3d0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
b3e0: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
b3f0: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
b400: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
b410: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
b420: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
b430: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
b440: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
b450: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
b460: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
b470: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
b480: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
b490: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b4a0: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
b4b0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b4c0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
b4d0: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
b4e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
b4f0: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
b500: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b510: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
b520: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
b530: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
b540: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
b550: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b560: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
b570: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
b580: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
b590: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
b5a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b5b0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
b5c0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
b5d0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
b5e0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
b5f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b600: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
b610: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
b620: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
b630: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
b640: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
b650: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
b660: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
b670: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
b680: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
b690: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
b6a0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
b6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b6c0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
b6d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
b6e0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
b6f0: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
b700: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
b710: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
b720: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
b730: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
b740: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
b750: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
b760: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
b770: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
b780: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b790: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
b7a0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
b7b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
b7c0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
b7d0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
b7e0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
b7f0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
b800: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
b810: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
b820: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
b830: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
b840: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
b850: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
b860: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
b870: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
b880: 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20  master );.  if( 
b890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b8a0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b8b0: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
b8c0: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
b8d0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b8e0: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
b8f0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
b900: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b910: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b920: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
b930: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
b940: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
b950: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
b960: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
b970: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
b980: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
b990: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
b9a0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
b9b0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
b9c0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
b9d0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
b9e0: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
b9f0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
ba00: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
ba10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
ba20: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
ba30: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
ba40: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
ba50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ba60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
ba70: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
ba80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ba90: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
baa0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
bab0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
bac0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
bad0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
bae0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
baf0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
bb00: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
bb10: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
bb20: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
bb30: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
bb40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
bb50: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
bb60: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
bb70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
bb80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
bb90: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
bba0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
bbb0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
bbc0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
bbd0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
bbe0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
bbf0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
bc00: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
bc10: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
bc20: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
bc30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
bc40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
bc50: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
bc60: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
bc70: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
bc80: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
bc90: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
bca0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
bcb0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
bcc0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72  QLITE_OK || jour
bcd0: 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  nal );.        i
bce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bcf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
bd00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
bd10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
bd20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
bd30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
bd40: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
bd50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bd60: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
bd70: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
bd80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bd90: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
bda0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
bdb0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
bdc0: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
bdd0: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
bde0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
bdf0: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
be00: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
be10: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
be20: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
be30: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
be40: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
be50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
be60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
be70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
be80: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
be90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bea0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
beb0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
bec0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
bed0: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
bee0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
bef0: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
bf00: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
bf10: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
bf20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
bf30: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
bf40: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
bf50: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
bf60: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
bf70: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
bf80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
bf90: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72  ic void pager_tr
bfa0: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67  uncate_cache(Pag
bfb0: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a  er *pPager);../*
bfc0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
bfd0: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
bfe0: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
bff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
c000: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
c010: 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65  d. Also truncate
c020: 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72   the cached repr
c030: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
c040: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
c050: 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
c060: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
c070: 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  er, int nPage){.
c080: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c090: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
c0a0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
c0b0: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
c0c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c0d0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c0e0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
c0f0: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
c100: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
c110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c120: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
c130: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
c140: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
c150: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
c180: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
c190: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
c1a0: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
c1b0: 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65  ize is the large
c1c0: 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  r of the sector 
c1d0: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
c1e0: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
c1f0: 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68  torSize() and th
c200: 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73  e pageSize..*/.s
c210: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
c220: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
c230: 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
c240: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
c250: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
c260: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
c270: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
c280: 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72  ectorSize<pPager
c290: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
c2a0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c2b0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
c2c0: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
c2d0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
c2e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
c2f0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
c300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c310: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
c320: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
c330: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
c340: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
c350: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
c360: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
c370: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
c380: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
c390: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
c3a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
c3b0: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
c3c0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
c3d0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c3e0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
c3f0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
c400: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
c410: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
c420: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
c430: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
c440: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
c450: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
c460: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
c470: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
c480: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
c490: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
c4a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
c4b0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
c4c0: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
c4d0: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
c4e0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
c4f0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
c510: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
c520: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
c530: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
c540: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
c550: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
c560: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c570: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c580: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
c590: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
c5a0: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
c5b0: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
c5c0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
c5d0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
c5e0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
c5f0: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
c600: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
c610: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
c620: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
c630: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
c640: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
c650: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
c660: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
c670: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
c680: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
c690: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
c6a0: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
c6b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
c6c0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
c6d0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
c6e0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
c6f0: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
c700: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
c710: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
c720: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
c730: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
c740: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
c750: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
c760: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
c770: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
c780: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
c790: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
c7a0: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
c7b0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
c7c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
c7d0: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
c7e0: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
c7f0: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
c800: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c810: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
c820: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
c830: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
c840: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
c850: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
c860: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
c870: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
c880: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
c890: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
c8a0: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
c8b0: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
c8c0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
c8d0: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
c8e0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c8f0: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
c900: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
c910: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
c920: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
c930: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
c940: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
c950: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
c960: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c970: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
c980: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
c990: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
c9a0: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
c9b0: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
c9c0: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
c9d0: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
c9e0: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
c9f0: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
ca00: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
ca10: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
ca20: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
ca30: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
ca40: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
ca50: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
ca60: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
ca70: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
ca80: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
ca90: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
caa0: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
cab0: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
cac0: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
cad0: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
cae0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
caf0: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
cb00: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
cb10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
cb20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
cb30: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
cb40: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
cb50: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
cb60: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
cb70: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
cb80: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
cb90: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
cba0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
cbb0: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
cbc0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
cbd0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
cbe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cbf0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
cc00: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
cc10: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
cc20: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
cc30: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
cc40: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
cc50: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
cc60: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
cc70: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
cc80: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
cc90: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
cca0: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
ccb0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
ccc0: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
ccd0: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
cce0: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
ccf0: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
cd00: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
cd10: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
cd20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
cd30: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
cd40: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
cd50: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
cd60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cd70: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
cd80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
cd90: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34  nt isHot){.  i64
cda0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
cdb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cdc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
cdd0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
cde0: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
cdf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ce00: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
ce10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
ce20: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
ce30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
ce40: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
ce50: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
ce60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ce70: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
ce80: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
ce90: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ceb0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
cec0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
ced0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
cee0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
cef0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
cf00: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
cf10: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
cf20: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
cf30: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
cf40: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
cf50: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
cf60: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
cf70: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
cf80: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cf90: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
cfa0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cfb0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
cfc0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
cfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
cfe0: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
cff0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
d000: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
d010: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d020: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
d030: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
d040: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
d050: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d060: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d070: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
d080: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
d090: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
d0a0: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
d0b0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
d0c0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
d0d0: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
d0e0: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
d0f0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
d100: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
d110: 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b  >jfd, &zMaster);
d120: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
d130: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d140: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d150: 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26  K || (zMaster &&
d160: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
d170: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20  xists(zMaster)) 
d180: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
d190: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
d1a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
d1b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d1c0: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
d1d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
d1e0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d1f0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  }.  sqlite3OsSee
d200: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  k(pPager->jfd, 0
d210: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
d220: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  rnalOff = 0;..  
d230: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
d240: 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
d250: 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
d260: 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
d270: 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
d280: 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
d290: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
d2a0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
d2b0: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
d2c0: 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
d2d0: 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
d2e0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
d2f0: 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
d300: 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
d310: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
d320: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
d330: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
d340: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
d350: 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
d360: 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
d370: 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
d380: 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
d390: 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
d3a0: 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
d3b0: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
d3c0: 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
d3d0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
d3e0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
d3f0: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
d400: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
d420: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d430: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
d440: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
d450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d460: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
d470: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
d480: 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
d490: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
d4a0: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
d4b0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
d4c0: 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
d4d0: 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
d4e0: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
d4f0: 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
d500: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
d510: 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
d520: 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
d530: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
d540: 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
d550: 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
d560: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
d570: 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
d580: 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
d590: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
d5a0: 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
d5b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d5c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
d5d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d5e0: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
d5f0: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
d600: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d610: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
d620: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
d630: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
d640: 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
d650: 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
d660: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
d670: 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
d680: 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68  * process. In th
d690: 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73 74  is case the rest
d6a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d6b0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
d6c0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c  .    ** journall
d6d0: 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67  ed copies of pag
d6e0: 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
d6f0: 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74  be read back int
d700: 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20  o the cache..   
d710: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
d720: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b  ==0 && !isHot ){
d730: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
d740: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
d750: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
d760: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
d770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d780: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
d790: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
d7a0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d7b0: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
d7c0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
d7d0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
d7e0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
d7f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d800: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d810: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
d820: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
d830: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
d840: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
d850: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
d860: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d870: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
d880: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d890: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d8a0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
d8b0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
d8c0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
d8d0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
d8e0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
d8f0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
d900: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
d910: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d920: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d930: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d940: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  jfd, 1);.      i
d950: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d970: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
d980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
d990: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d9a0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
d9b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
d9d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
d9f0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
da00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
da10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
da20: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
da30: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
da40: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
da50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
da60: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
da70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
da80: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
da90: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
daa0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
dab0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
dac0: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
dad0: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
dae0: 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
daf0: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
db00: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
db10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
db20: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
db30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
db40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
db50: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
db60: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
db70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
db80: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
db90: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
dba0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
dbb0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
dbc0: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
dbd0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
dbe0: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
dbf0: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
dc00: 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
dc10: 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
dc20: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
dc30: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
dc40: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
dc50: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
dc60: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
dc70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
dc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
dc90: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
dca0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
dcb0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
dcc0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dcd0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
dce0: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
dcf0: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
dd00: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
dd10: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
dd20: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
dd30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
dd40: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
dd50: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
dd60: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
dd70: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
dd80: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
dd90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
dda0: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
ddb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
ddc0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
ddd0: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
dde0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ddf0: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
de00: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
de10: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
de20: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
de30: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
de40: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
de50: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
de60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de70: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
de80: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
de90: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
deb0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
dec0: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
ded0: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
dee0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
def0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
df00: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
df10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
df20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
df30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
df40: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
df50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df60: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
df70: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
df80: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
df90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
dfa0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
dfb0: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
dfc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dfd0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dfe0: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
dff0: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
e000: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
e010: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
e020: 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
e030: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
e040: 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
e050: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
e060: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
e070: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
e080: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
e090: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
e0a0: 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
e0b0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e0c0: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
e0d0: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
e0e0: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
e0f0: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
e100: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
e110: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e120: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
e130: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
e140: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
e150: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
e160: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
e170: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
e180: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
e190: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
e1a0: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
e1b0: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
e1c0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
e1d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e1e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
e1f0: 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
e200: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
e210: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
e220: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
e230: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
e240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e250: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
e260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e270: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
e280: 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
e290: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
e2a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
e2b0: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
e2c0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
e2d0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
e2e0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
e2f0: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
e300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e310: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
e320: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
e330: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
e340: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
e350: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
e360: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
e370: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
e380: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
e390: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
e3a0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
e3b0: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
e3c0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
e3d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
e3e0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
e3f0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
e400: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e410: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e420: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e430: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e440: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e450: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
e460: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
e470: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
e480: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
e490: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
e4a0: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
e4b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e4c0: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
e4d0: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
e4e0: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
e4f0: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
e500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
e510: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
e520: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
e530: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
e540: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
e550: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
e560: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
e570: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
e580: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
e590: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e5a0: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
e5b0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
e5c0: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
e5d0: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
e5e0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
e5f0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
e600: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
e610: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
e620: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
e630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e640: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
e650: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e660: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
e670: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
e680: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
e690: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
e6a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
e6b0: 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61  um;.  while( pPa
e6c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e6d0: 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  < hdrOff ){.    
e6e0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
e6f0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
e700: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
e710: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
e720: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
e730: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
e740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e750: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
e760: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
e770: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
e780: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
e790: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
e7a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e7b0: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
e7c0: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
e7d0: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
e7e0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
e7f0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
e800: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
e810: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e820: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e830: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
e840: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
e850: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
e860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
e870: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
e880: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
e890: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
e8a0: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
e8b0: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
e8c0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
e8d0: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
e8e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e8f0: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
e900: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
e910: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
e920: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
e930: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
e940: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e950: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e960: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e970: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e980: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e9a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e9b0: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
e9c0: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
e9d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
e9e0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
e9f0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ea00: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
ea10: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
ea20: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
ea30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ea40: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
ea50: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
ea60: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
ea70: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
ea80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
ea90: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
eaa0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
eab0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
eac0: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
ead0: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
eae0: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
eaf0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
eb00: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
eb10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
eb20: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
eb30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
eb40: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
eb50: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
eb60: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
eb70: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
eb80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
eb90: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
eba0: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
ebb0: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
ebc0: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
ebd0: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
ebe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
ebf0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
ec00: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
ec10: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
ec30: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
ec40: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
ec50: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
ec60: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
ec70: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
ec80: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
ec90: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
eca0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
ecb0: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
ecc0: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
ecd0: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
ecf0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
ed00: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
ed10: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
ed20: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
ed30: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
ed40: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
ed50: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
ed60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
ed70: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
ed80: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
ed90: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
eda0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
edb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
edc0: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
edd0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
ede0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
edf0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
ee00: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
ee10: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
ee20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ee30: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
ee40: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
ee50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
ee60: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
ee80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
ee90: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
eea0: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
eeb0: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
eec0: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
eed0: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
eee0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
eef0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
ef00: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
ef10: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
ef20: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
ef30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ef40: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
ef50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
ef60: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
ef70: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
ef80: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
ef90: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
efa0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
efb0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
efc0: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
efd0: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
efe0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
eff0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
f000: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
f010: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
f020: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f030: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
f040: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
f050: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
f060: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
f070: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
f080: 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  _fsync){.  pPage
f090: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
f0a0: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
f0b0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
f0c0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
f0d0: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
f0e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
f0f0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
f100: 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63  ync = full_fsync
f110: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f120: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
f130: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
f140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f150: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
f160: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
f170: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
f180: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
f190: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
f1a0: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
f1b0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
f1c0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
f1d0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
f1e0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
f1f0: 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
f200: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
f210: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
f220: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
f230: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
f240: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
f250: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
f260: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f270: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
f280: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
f290: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
f2a0: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
f2b0: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
f2c0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
f2d0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
f2e0: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
f2f0: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
f300: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
f310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
f320: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
f330: 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29  mp(OsFile **pFd)
f340: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b  {.  int cnt = 8;
f350: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
f360: 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54  r zFile[SQLITE_T
f370: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
f380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
f390: 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
f3a0: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
f3b0: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
f3c0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
f3d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
f3e0: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
f3f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
f400: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
f410: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f420: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
f430: 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31  ve(zFile, pFd, 1
f440: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
f450: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f460: 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c 65  *pFd );.  }while
f470: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
f480: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
f490: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
f4a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f4b0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f4c0: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
f4d0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
f4e0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
f4f0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
f500: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
f510: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
f520: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
f530: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
f540: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
f550: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
f560: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
f570: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
f580: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
f590: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
f5a0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
f5b0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
f5c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
f5d0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
f5e0: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
f5f0: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
f600: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
f610: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
f620: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
f630: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
f640: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
f650: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
f660: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
f670: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f680: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
f690: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
f6a0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
f6b0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
f6c0: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
f6d0: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
f6e0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
f6f0: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
f700: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
f710: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
f720: 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65  agerOpen(.  Page
f730: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
f740: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
f750: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f760: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
f770: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
f780: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
f790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f7a0: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
f7b0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
f7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
f7d0: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
f7e0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
f7f0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
f800: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
f810: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
f820: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
f830: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
f840: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
f850: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
f860: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
f870: 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70  ameLen;  /* Comp
f880: 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54  iler is wrong. T
f890: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e  his is always in
f8a0: 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
f8b0: 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65   use */.  OsFile
f8c0: 20 2a 66 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20   *fd = 0;.  int 
f8d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f8e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
f8f0: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
f900: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
f910: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
f920: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
f930: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
f940: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
f950: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
f960: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
f970: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
f980: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
f990: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
f9a0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66  PNAME_SIZE];.#if
f9b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f9c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
f9d0: 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
f9e0: 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
f9f0: 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
fa00: 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
fa10: 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
fa20: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
fa30: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
fa40: 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
fa50: 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
fa60: 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
fa70: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
fa80: 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
fa90: 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
faa0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
fab0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
fac0: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
fad0: 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
fae0: 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69  . It would be ni
faf0: 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a  ce to assert.  *
fb00: 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  * that ThreadDat
fb10: 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d  a.nAlloc is non-
fb20: 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74  zero, but alas t
fb30: 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20  his breaks test 
fb40: 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74  cases .  ** writ
fb50: 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ten to invoke th
fb60: 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79  e pager directly
fb70: 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
fb80: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
fb90: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
fba0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
fbb0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
fbc0: 57 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  We used to test 
fbd0: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20  if malloc() had 
fbe0: 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 62  already failed b
fbf0: 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67  efore proceeding
fc00: 2e 20 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  . .  ** But the 
fc10: 77 61 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f  way this functio
fc20: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 53 51 4c  n is used in SQL
fc30: 69 74 65 20 6d 65 61 6e 73 20 74 68 61 74 20 63  ite means that c
fc40: 61 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61  an never.  ** ha
fc50: 70 70 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72  ppen. Furthermor
fc60: 65 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63  e, if the malloc
fc70: 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 69 73 20  -failed flag is 
fc80: 61 6c 72 65 61 64 79 20 73 65 74 2c 20 0a 20 20  already set, .  
fc90: 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 61  ** either the ca
fca0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 53 74 72 44  ll to sqliteStrD
fcb0: 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65 4d 61  up() or sqliteMa
fcc0: 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77 69 6c  lloc() below wil
fcd0: 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72  l.  ** fail shor
fce0: 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  tly and SQLITE_N
fcf0: 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20 61 6e  OMEM returned an
fd00: 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  yway..  */.  *pp
fd10: 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
fd20: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
fd30: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
fd40: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
fd50: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
fd60: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
fd70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
fd80: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
fd90: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
fda0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
fdb0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
fdc0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
fdd0: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
fde0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
fdf0: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
fe00: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
fe10: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
fe20: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
fe30: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
fe40: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
fe50: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
fe60: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
fe70: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
fe80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
fe90: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
fea0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
feb0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
fec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
fed0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
fee0: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
fef0: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
ff00: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20 20 61  Only);.        a
ff10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ff20: 45 5f 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a 20 20  E_OK || fd );.  
ff30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
ff40: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
ff50: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
ff60: 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  mp(&fd);.    sql
ff70: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
ff80: 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a  me(zTemp);.    z
ff90: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
ffa0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
ffb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
ffc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
ffd0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
ffe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fff0: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
10000 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
10010 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
10020 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
10030 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
10040 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
10050 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
10060 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
10070 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
10080 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
10090 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
100a0 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
100b0 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
100c0 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
100d0 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
100e0 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
100f0 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
10100 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
10110 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
10120 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
10130 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
10140 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
10150 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69  *3 + 30 );.    i
10160 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
10170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10180 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
10190 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
101a0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
101b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
101c0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
101d0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61  .  }...  /* If a
101e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
101f0 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
10200 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
10210 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
10220 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
10230 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
10240 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
10250 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
10260 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
10270 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
10280 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
10290 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
102a0 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
102b0 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
102c0 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
102d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
102e0 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
102f0 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72  hname || !pPager
10300 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72  ->pTmpSpace || r
10310 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10320 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10330 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
10340 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
10350 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  hname);.    sqli
10360 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
10370 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
10380 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
10390 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
103a0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
103b0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
103c0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
103d0 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
103e0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
103f0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
10400 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
10410 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
10420 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
10430 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
10440 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
10450 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
10460 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
10470 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
10480 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
10490 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
104a0 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 63  meLen+1];.  memc
104b0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
104c0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
104d0 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b  ame, nameLen+1);
104e0 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
104f0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
10500 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d  ullPathname, nam
10510 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f 72 28  eLen+1);..  for(
10520 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
10530 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
10540 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
10550 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
10560 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
10570 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
10580 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
10590 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
105a0 50 61 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c 65 6e  Pathname,nameLen
105b0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
105c0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
105d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
105e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
105f0 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  en], "-journal",
10600 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
10610 22 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  "));.  pPager->f
10620 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
10630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10640 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
10650 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
10660 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
10670 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
10680 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
10690 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
106a0 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
106b0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
106c0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
106d0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
106e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
106f0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
10700 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
10710 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
10720 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
10730 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
10740 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
10750 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
10760 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
10770 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
10780 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
10790 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
107a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
107b0 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
107c0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
107d0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
107e0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
107f0 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20  _UNLOCK==0 );.  
10800 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
10810 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
10820 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
10830 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
10840 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
10850 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
10860 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
10870 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
10880 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
10890 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
108a0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
108b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
108c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
108d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
108e0 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
108f0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
10900 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
10910 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
10920 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
10930 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
10940 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
10950 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
10960 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
10970 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
10980 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
10990 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
109a0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
109b0 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
109c0 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70  ync?0:1);.  /* p
109d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
109e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
109f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10a00 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10a10 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
10a20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
10a30 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
10a40 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
10a50 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44   assert(fd||memD
10a60 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  b);.  if( !memDb
10a70 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
10a80 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
10a90 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
10aa0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
10ab0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
10ac0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
10ad0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
10ae0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
10af0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
10b00 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
10b10 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
10b20 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
10b30 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
10b40 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
10b50 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
10b60 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
10b70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10b80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
10b90 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
10ba0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
10bb0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
10bc0 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
10bd0 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
10be0 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
10bf0 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
10c00 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
10c10 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
10c20 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
10c30 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
10c40 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
10c50 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
10c60 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
10c70 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
10c80 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
10c90 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
10ca0 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
10cb0 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
10cc0 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
10cd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
10ce0 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
10cf0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
10d00 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
10d10 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
10d20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
10d30 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
10d40 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
10d50 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
10d60 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
10d70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
10d80 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
10d90 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
10da0 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
10db0 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
10dc0 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
10dd0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
10de0 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
10df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10e00 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
10e10 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
10e20 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
10e30 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
10e40 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
10e50 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
10e60 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
10e70 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
10e80 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
10e90 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
10ea0 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
10eb0 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
10ec0 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
10ed0 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
10ee0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
10ef0 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
10f00 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
10f10 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
10f20 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
10f30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
10f40 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
10f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
10f60 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
10f70 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
10f80 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
10f90 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
10fa0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
10fb0 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e  ge size.  Return
10fc0 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20   the new size.  
10fd0 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
10fe0 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  ew page.** size 
10ff0 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  is inappropriate
11000 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
11010 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
11020 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  is selected.** a
11030 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  nd returned..*/.
11040 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11050 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
11060 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70  r *pPager, int p
11070 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65  ageSize){.  asse
11080 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  rt( pageSize>=51
11090 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
110a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
110b0 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50  IZE );.  if( !pP
110c0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
110d0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
110e0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
110f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
11100 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11110 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
11120 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
11130 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  e = sqlite3Reall
11140 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d  ocOrFree(pPager-
11150 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65  >pTmpSpace, page
11160 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
11170 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
11180 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Size;.}../*.** A
11190 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
111a0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
111b0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
111c0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
111d0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
111e0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
111f0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
11200 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
11210 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
11220 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11230 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
11240 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
11250 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
11260 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
11270 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
11280 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
11290 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
112a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
112b0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
112c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
112d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
112e0 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
112f0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
11300 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
11310 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11320 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11330 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11340 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
11350 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
11360 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
11370 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
11380 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
11390 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
113a0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
113b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
113c0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
113d0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
113e0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
113f0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
11400 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
11410 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
11420 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
11430 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
11440 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
11450 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
11460 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
11470 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
11480 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
11490 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
114a0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
114b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
114c0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
114d0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
114e0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
114f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
11500 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
11510 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11520 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
11530 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
11540 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
11550 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
11560 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
11570 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
11580 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
11590 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
115a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
115b0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
115c0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
115d0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
115e0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
115f0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11600 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
11610 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
11620 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11630 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
11640 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
11650 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
11660 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
11670 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
11680 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
11690 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
116a0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
116b0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
116c0 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
116d0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
116e0 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
116f0 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
11700 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
11710 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
11720 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
11730 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
11740 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
11750 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
11760 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
11770 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
11780 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
11790 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
117a0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
117b0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
117c0 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
117d0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
117e0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
117f0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
11800 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
11810 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
11820 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
11840 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
11850 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
11860 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
11870 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11880 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
11890 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
118a0 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
118b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
118c0 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
118d0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
118e0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
118f0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
11900 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
11910 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
11920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
11940 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
11950 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11980 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
11990 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
119a0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
119b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
119c0 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
119d0 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
119e0 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
119f0 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
11a00 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
11a10 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
11a20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
11a30 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
11a40 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
11a50 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
11a60 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
11a70 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
11a80 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
11a90 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
11aa0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
11ab0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
11ac0 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
11ad0 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
11ae0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11af0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
11b00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
11b10 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
11b20 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
11b30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
11b40 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
11b50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
11b60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
11b70 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
11b80 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
11b90 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
11ba0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
11bb0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11bc0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
11bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11be0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
11bf0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
11c00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
11c10 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
11c20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
11c30 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
11c40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
11c50 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
11c60 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
11c70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11c80 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
11c90 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
11ca0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11cc0 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
11cd0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
11ce0 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
11cf0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
11d00 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
11d10 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11d20 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
11d30 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
11d40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
11d50 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
11d60 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
11d70 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
11d80 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
11d90 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
11da0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
11db0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
11dc0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
11dd0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
11de0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
11df0 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
11e00 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
11e10 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
11e20 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
11e30 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
11e40 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
11e50 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
11e60 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
11e70 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
11e80 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
11e90 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
11ea0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
11eb0 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
11ec0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
11ed0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
11ee0 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
11ef0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
11f00 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
11f10 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
11f20 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
11f30 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
11f40 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
11f50 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
11f60 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
11f70 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
11f80 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11f90 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
11fa0 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
11fb0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
11fc0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
11fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
11fe0 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
11ff0 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
12000 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
12010 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
12020 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
12030 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
12040 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
12050 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
12060 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
12070 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
12080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12090 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
120a0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
120b0 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
120c0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
120d0 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
120e0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
120f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
12100 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
12110 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
12120 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
12130 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
12140 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
12150 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
12160 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
12170 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
12180 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
12190 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
121a0 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
121b0 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
121c0 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
121d0 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
121e0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
121f0 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
12200 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
12210 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
12220 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
12230 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
12240 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
12250 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
12260 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
12270 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
12280 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
12290 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
122a0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
122b0 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
122c0 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
122d0 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
122e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
122f0 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
12300 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
12310 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
12320 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
12330 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
12340 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
12350 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12360 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
12370 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
12380 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
12390 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
123a0 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
123b0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
123c0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
123d0 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
123e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
123f0 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
12400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
12410 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12420 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
12430 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
12440 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
12450 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
12460 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
12470 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
12480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12490 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
124a0 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
124b0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
124c0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
124d0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
124e0 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
124f0 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
12500 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
12510 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
12520 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
12530 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
12540 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
12550 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
12560 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61  the cache when a
12570 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
12580 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70  truncated.  Drop
12590 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
125a0 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
125b0 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65  pgno is.** large
125c0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
125d0 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
125e0 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  eferenced..**.**
125f0 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
12600 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
12610 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
12620 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41   zeroed..**.** A
12630 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20  ctually, at the 
12640 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
12650 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
12660 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20   would be.** an 
12670 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20  error to have a 
12680 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e  referenced page.
12690 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61    But rather tha
126a0 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74  n delete.** that
126b0 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e   page and guaran
126c0 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74  tee a subsequent
126d0 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65   segfault, it se
126e0 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f  ems better.** to
126f0 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70   zero it and hop
12700 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20  e that we error 
12710 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73  out sanely..*/.s
12720 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
12730 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
12740 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12750 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
12760 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
12770 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
12780 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
12790 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
127a0 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
127b0 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
127c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
127d0 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
127e0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
127f0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
12800 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
12810 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
12820 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
12830 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
12840 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12850 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
12860 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
12870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
12880 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
12890 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52  tAll;.      IOTR
128a0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
128b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
128c0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
128d0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
128e0 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
128f0 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
12900 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
12910 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
12920 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
12930 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
12940 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
12950 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
12960 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
12970 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
12980 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
12990 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
129a0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
129b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
129c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
129d0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
129e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
129f0 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
12a00 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
12a10 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
12a20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
12a30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
12a40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
12a50 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
12a60 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
12a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12a80 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12a90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12aa0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
12ab0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
12ac0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
12ad0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
12ae0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
12af0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
12b00 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
12b10 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
12b20 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
12b30 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
12b40 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
12b50 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
12b60 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
12b70 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
12b80 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
12b90 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
12ba0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
12bb0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
12bc0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
12bd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12be0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
12bf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
12c00 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
12c10 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12c20 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
12c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
12c50 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
12c60 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
12c70 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
12c80 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
12c90 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12ca0 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
12cb0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
12cc0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
12cd0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
12ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12d00 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
12d10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
12d20 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
12d30 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
12d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12d60 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
12d70 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
12d80 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
12d90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12da0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
12db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12dc0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
12dd0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
12de0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12df0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
12e00 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
12e10 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12e20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
12e30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12e40 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
12e50 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
12e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12e70 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
12e80 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
12e90 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
12ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12eb0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
12ec0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
12ed0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
12ee0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
12ef0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
12f00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12f10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
12f20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
12f30 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
12f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
12f60 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
12f70 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
12f80 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
12f90 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
12fa0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
12fb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
12fc0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
12fd0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
12fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13000 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
13010 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
13020 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
13030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
13040 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
13050 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
13060 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
13070 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
13080 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
13090 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
130a0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
130b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
130c0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
130d0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
130e0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
130f0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
13100 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
13110 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
13120 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
13130 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
13140 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
13150 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
13160 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
13170 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
13180 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
13190 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
131a0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
131b0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
131c0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
131d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
131e0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
131f0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
13200 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
13210 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13220 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
13230 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
13240 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
13250 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
13260 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
13270 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
13280 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
13290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
132a0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
132b0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
132c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
132d0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
132e0 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63   /* A malloc() c
132f0 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71  annot fail in sq
13300 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
13310 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ) as one or more
13320 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20   calls to .  ** 
13330 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61  malloc() must ha
13340 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
13350 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72  made by this thr
13360 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65  ead before it ge
13370 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ts.  ** to this 
13380 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  point. This mean
13390 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
133a0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
133b0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64  allocated alread
133c0 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54  y.  ** so that T
133d0 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
133e0 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a   can be set..  *
133f0 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  /.  ThreadData *
13400 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
13410 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73  readData();.  as
13420 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a  sert( pPager );.
13430 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26    assert( pTsd &
13440 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29  & pTsd->nAlloc )
13450 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  ;.#endif..  disa
13460 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13470 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61  _errors();.  pPa
13480 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
13490 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
134a0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
134b0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
134c0 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  ger);.  pagerUnl
134d0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
134e0 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
134f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13500 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
13510 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
13520 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13530 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
13540 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
13550 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
13560 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
13570 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
13580 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
13590 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
135a0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
135b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
135c0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
135d0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
135e0 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
135f0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
13600 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
13610 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
13620 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
13630 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
13640 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
13650 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
13660 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
13670 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
13680 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13690 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
136a0 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
136b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
136c0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
136d0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
136e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
136f0 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
13700 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
13710 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
13720 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
13730 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
13740 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
13750 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
13760 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
13770 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
13780 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
13790 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
137a0 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
137b0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
137c0 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
137d0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
137e0 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
137f0 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
13800 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
13810 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
13820 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
13830 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
13840 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
13850 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
13860 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
13870 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
13880 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
13890 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
138a0 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ace);.  sqliteFr
138b0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
138c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
138d0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
138e0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
138f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
13900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13910 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
13920 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
13930 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
13940 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
13950 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
13960 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
13970 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
13980 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
13990 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
139a0 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
139b0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
139c0 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
139d0 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
139e0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
139f0 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
13a00 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
13a10 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
13a20 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
13a30 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
13a40 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
13a50 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
13a60 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
13a70 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
13a80 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
13a90 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
13aa0 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
13ab0 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
13ac0 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
13ad0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
13ae0 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
13af0 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
13b00 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
13b10 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
13b20 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
13b30 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
13b40 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
13b50 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
13b60 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
13b70 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
13b80 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
13b90 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
13ba0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
13bb0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
13bc0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
13bd0 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
13be0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
13bf0 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
13c00 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
13c10 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13c20 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
13c30 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
13c40 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
13c50 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
13c60 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
13c70 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
13c80 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
13c90 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
13ca0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
13cb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13cc0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
13cd0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
13ce0 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
13cf0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
13d00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13d10 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
13d20 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
13d30 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
13d40 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
13d50 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
13d60 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
13d70 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
13d80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13d90 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
13da0 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
13db0 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
13dc0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
13dd0 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
13de0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13df0 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
13e00 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
13e10 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
13e20 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
13e30 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
13e40 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
13e50 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
13e60 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
13e70 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
13e80 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
13e90 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
13ea0 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
13eb0 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
13ec0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
13ed0 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
13ee0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
13ef0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
13f00 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
13f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
13f30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13f40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
13f50 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
13f60 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
13f70 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
13f80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
13f90 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
13fa0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
13fb0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
13fc0 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
13fd0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
13fe0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
13ff0 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
14000 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
14010 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
14020 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
14030 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
14040 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
14050 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
14060 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
14070 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
14080 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
14090 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
140a0 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
140b0 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
140c0 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
140d0 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
140e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
140f0 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
14100 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
14110 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
14120 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
14130 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
14140 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
14150 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
14160 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
14170 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
14180 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
14190 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
141a0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
141b0 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
141c0 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
141d0 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
141e0 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
141f0 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
14200 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
14210 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
14220 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
14230 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
14240 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
14250 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
14260 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
14270 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
14280 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
14290 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
142a0 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
142b0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
142c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
142d0 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
142e0 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
142f0 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
14300 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
14310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14320 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
14330 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
14340 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
14350 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14360 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
14370 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
14380 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
14390 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
143a0 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
143b0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
143c0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
143d0 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
143e0 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
143f0 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
14400 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14410 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14420 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14430 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
14440 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
14450 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
14460 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
14470 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
14480 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
14490 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
144a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
144b0 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
144c0 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
144d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
144e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
144f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
14500 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
14510 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
14520 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
14530 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
14540 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
14550 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
14560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
14570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14580 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
14590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
145a0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
145b0 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
145c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
145d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
145e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
145f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14600 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
14610 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
14620 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
14630 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
14640 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
14650 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
14660 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
14670 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
14680 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
14690 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
146a0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
146b0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
146c0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
146d0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
146e0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
146f0 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
14700 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
14710 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
14720 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
14730 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
14740 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14750 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
14760 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
14770 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
14780 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
14790 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
147a0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
147b0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
147c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147d0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
147e0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
147f0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
14800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14810 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
14820 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
14830 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14860 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
14870 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
14880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14890 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
148a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
148b0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
148c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
148e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
148f0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
14900 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
14910 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14920 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
14930 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
14940 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
14950 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14970 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
14980 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14990 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
149a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
149b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
149c0 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
149d0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
149e0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
149f0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14a00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
14a10 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
14a20 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r)).      rc = s
14a30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
14a40 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
14a50 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
14a60 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
14a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14a80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14a90 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
14aa0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
14ab0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
14ac0 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
14ad0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
14ae0 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
14af0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
14b00 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
14b10 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
14b20 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
14b30 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
14b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
14b50 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
14b60 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
14b70 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
14b80 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
14b90 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
14ba0 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
14bb0 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
14bc0 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
14bd0 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
14be0 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
14bf0 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
14c00 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
14c10 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
14c20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
14c30 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
14c40 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
14c50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14c70 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
14c80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14c90 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
14ca0 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
14cb0 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
14cc0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
14cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
14ce0 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
14cf0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
14d00 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
14d10 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
14d20 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
14d30 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
14d40 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
14d50 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
14d60 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
14d70 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
14d80 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
14d90 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
14da0 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
14db0 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
14dc0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
14dd0 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
14de0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
14df0 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
14e00 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
14e10 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
14e20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14e30 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
14e40 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
14e50 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
14e60 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
14e70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14e80 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
14e90 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
14ea0 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
14eb0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
14ec0 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
14ed0 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
14ee0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
14ef0 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
14f00 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
14f10 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
14f20 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
14f30 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
14f40 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
14f50 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
14f60 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
14f70 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
14f80 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
14f90 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
14fa0 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
14fb0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
14fc0 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
14fd0 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
14fe0 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
14ff0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
15000 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
15010 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
15020 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
15030 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
15040 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
15050 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
15060 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
15070 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
15080 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
15090 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
150a0 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
150b0 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
150c0 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
150d0 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
150e0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
150f0 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
15100 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
15110 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
15120 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
15130 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
15140 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
15150 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
15160 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
15170 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
15180 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
15190 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
151a0 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
151b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
151c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
151d0 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
151e0 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
151f0 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
15200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15210 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
15220 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
15230 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
15240 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
15250 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
15260 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
15270 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
15280 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
15290 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
152a0 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
152b0 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
152c0 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
152d0 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
152e0 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
152f0 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
15300 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
15310 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
15320 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
15330 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
15340 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
15350 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
15360 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
15370 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
15380 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
15390 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
153a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
153b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
153c0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
153d0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
153e0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
153f0 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
15400 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
15410 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
15420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15430 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
15440 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
15450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
15460 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
15470 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
15480 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
15490 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
154a0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
154b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
154c0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
154d0 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
154e0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
154f0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
15500 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
15510 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
15520 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
15530 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
15540 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15550 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15560 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
15570 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
15580 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
15590 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
155a0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
155b0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
155c0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
155d0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
155e0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
155f0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
15600 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
15610 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
15620 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
15630 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
15640 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
15650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
15660 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
15670 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
15680 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
15690 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
156a0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
156b0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
156c0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
156d0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
156e0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
156f0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
15700 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
15710 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
15720 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
15730 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
15740 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
15750 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
15760 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
15770 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
15780 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
15790 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
157a0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
157b0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
157c0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
157d0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
157e0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
157f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15800 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
15810 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
15820 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
15830 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
15840 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
15850 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
15860 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
15870 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
15880 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
158a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
158b0 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67  pList = sort_pag
158c0 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20  elist(pList);.  
158d0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
158e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
158f0 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
15900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
15910 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
15920 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
15930 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
15940 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
15950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15960 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
15970 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
15980 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
15990 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
159a0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
159b0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
159c0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
159d0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
159e0 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
159f0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
15a00 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
15a10 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
15a20 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
15a30 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
15a40 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
15a50 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
15a60 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
15a70 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
15a80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
15a90 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  {.      char *pD
15aa0 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ata = CODEC2(pPa
15ab0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
15ac0 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
15ad0 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
15ae0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
15af0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
15b00 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
15b30 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
15b40 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
15b50 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
15b60 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
15b70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15b80 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
15b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15ba0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
15bb0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
15bc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
15bd0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
15be0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
15bf0 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
15c00 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
15c10 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
15c20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
15c30 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
15c40 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15c50 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15c60 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
15c70 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
15c80 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
15c90 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
15ca0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
15cb0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
15cc0 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
15cd0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
15ce0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
15cf0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
15d00 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
15d10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15d20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
15d30 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
15d40 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
15d50 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
15d60 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
15d70 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
15d80 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
15d90 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
15da0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15db0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
15dc0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
15dd0 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
15de0 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
15df0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
15e00 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
15e10 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
15e20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
15e30 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
15e40 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
15e50 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
15e60 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
15e70 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
15e80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15e90 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15ea0 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
15eb0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15ec0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
15ed0 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
15ee0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
15ef0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
15f00 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
15f10 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
15f20 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15f30 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
15f40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15f50 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
15f60 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
15f70 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
15f80 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
15f90 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
15fa0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
15fb0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
15fc0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
15fd0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
15fe0 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
15ff0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
16000 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
16010 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
16020 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
16030 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
16040 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
16050 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
16060 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nal) ){.    retu
16070 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
16080 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
16090 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
160a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
160b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
160c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
160d0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
160e0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
160f0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
16100 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
16110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
16120 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
16130 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
16140 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
16150 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
16160 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
16170 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
16180 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
16190 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
161a0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
161b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
161c0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
161d0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
161e0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
161f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16200 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
16210 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
16220 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
16230 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
16240 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
16250 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
16260 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
16270 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
16280 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
16290 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
162a0 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
162b0 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
162c0 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
162d0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
162e0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
162f0 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
16300 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
16310 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
16320 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
16330 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
16340 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
16350 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
16360 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
16370 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
16380 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
16390 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
163a0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
163b0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
163c0 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
163d0 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
163e0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
163f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
16400 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
16410 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
16420 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16430 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
16440 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
16450 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16460 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
16470 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
16480 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
16490 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
164a0 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
164b0 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
164c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
164d0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
164e0 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
164f0 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
16500 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
16510 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
16520 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
16530 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
16540 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
16550 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
16560 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
16570 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
16580 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
16590 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
165a0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
165b0 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
165c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
165d0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
165e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
165f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
16600 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
16610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
16620 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
16630 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
16640 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
16650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
16670 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16680 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
16690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
166a0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
166b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
166c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
166d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
166e0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
166f0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
16700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16710 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
16720 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
16730 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
16740 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
16750 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
16760 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
16770 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
16780 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
16790 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
167a0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
167b0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
167c0 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
167d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
167e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
167f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16800 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
16810 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
16820 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
16830 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
16840 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
16850 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
16860 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
16870 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
16880 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
16890 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
168a0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
168b0 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
168c0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
168d0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
168e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
168f0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
16900 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
16910 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
16920 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
16930 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
16940 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
16950 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
16960 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
16970 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
16980 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
16990 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
169a0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
169b0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
169c0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
169d0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
169e0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
169f0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
16a00 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
16a10 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
16a20 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
16a30 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
16a40 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
16a50 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
16a60 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
16a70 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
16a80 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
16a90 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
16aa0 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
16ab0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
16ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
16ad0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
16ae0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
16af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
16b10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16b20 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
16b30 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
16b40 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
16b50 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
16b60 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
16b70 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
16b80 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
16b90 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
16ba0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
16bb0 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
16bc0 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
16bd0 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
16be0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16bf0 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
16c00 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
16c10 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
16c20 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
16c30 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
16c40 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
16c50 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
16c60 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
16c70 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
16c80 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
16c90 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
16ca0 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
16cb0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
16cc0 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65  eased..*/.#if de
16cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
16ce0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
16cf0 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e  EMENT) && !defin
16d00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
16d10 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69 74  ISKIO).int sqlit
16d20 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
16d30 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
16d40 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
16d50 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c  ta *pTsdro = sql
16d60 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
16d70 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20  adOnly();.  int 
16d80 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20  nReleased = 0;. 
16d90 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66   int i;..  /* If
16da0 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20   the the global 
16db0 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74  mutex is held, t
16dc0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62  his subroutine b
16dd0 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d  ecomes a.  ** o-
16de0 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f  op; zero bytes o
16df0 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65  f memory are fre
16e00 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  ed.  This is bec
16e10 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f  ause.  ** some o
16e20 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b  f the code invok
16e30 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16e40 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a  ion may also.  *
16e50 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * try to obtain 
16e60 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c  the mutex, resul
16e70 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f  ting in a deadlo
16e80 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ck..  */.  if( s
16e90 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
16ea0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
16eb0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75   0;.  }..  /* Ou
16ec0 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e  termost loop run
16ed0 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77  s for at most tw
16ee0 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69  o iterations. Fi
16ef0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65  rst iteration we
16f00 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e  .  ** try to fin
16f10 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61  d memory that ca
16f20 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  n be released wi
16f30 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73  thout calling fs
16f40 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20  ync(). Second.  
16f50 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68  ** iteration (wh
16f60 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66  ich only runs if
16f70 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65   the first faile
16f80 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62  d to free nReq b
16f90 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d  ytes of.  ** mem
16fa0 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65  ory) is permitte
16fb0 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28  d to call fsync(
16fc0 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f  ). This is of co
16fd0 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a  urse much more .
16fe0 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a    ** expensive..
16ff0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
17000 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  i<=1; i++){..   
17010 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17020 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20   all the SQLite 
17030 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79  pagers opened by
17040 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
17050 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65  ead. */.    Page
17060 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64  r *pPager = pTsd
17070 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  ro->pPager;.    
17080 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26  for( ; pPager &&
17090 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
170a0 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61  eased<nReq); pPa
170b0 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
170c0 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
170d0 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
170e0 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d  rc;..      if( M
170f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
17100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17110 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  }..      /* For 
17120 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20  each pager, try 
17130 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20  to free as many 
17140 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c  pages as possibl
17150 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20  e (without .    
17160 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79    ** calling fsy
17170 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20  nc() if this is 
17180 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
17190 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ion of the outer
171a0 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c  most .      ** l
171b0 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oop)..      */. 
171c0 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49       while( SQLI
171d0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67  TE_OK==(rc = pag
171e0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
171f0 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20  r, i, &pPg)) && 
17200 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  pPg) {.        /
17210 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
17220 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
17230 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
17240 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
17250 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
17260 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
17270 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
17280 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
17290 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
172a0 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
172b0 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
172c0 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
172d0 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
172e0 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
172f0 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
17300 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
17310 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
17320 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
17330 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
17340 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
17350 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
17360 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
17370 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
17380 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
17390 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
173a0 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
173b0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
173c0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
173d0 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
173e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
173f0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
17400 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  All;.        }el
17410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
17420 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e  r( pTmp=pPager->
17430 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
17440 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
17450 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
17460 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
17470 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
17480 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
17490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
174a0 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69  Released += sqli
174b0 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29  teAllocSize(pPg)
174c0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
174d0 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
174e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
174f0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
17500 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
17510 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
17520 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
17530 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
17540 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
17550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
17570 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
17580 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
17590 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
175a0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
175b0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
175c0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
175d0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
175e0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
175f0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
17600 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
17610 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
17620 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
17630 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
17640 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
17650 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
17660 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
17670 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
17680 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
17690 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
176a0 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
176b0 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
176c0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
176d0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
176e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
176f0 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  rt( (rc&0xff)==S
17700 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
17710 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
17720 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17730 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17740 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
17750 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
17760 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
17770 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
17780 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
17790 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
177a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
177b0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
177c0 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c 49 54  GEMENT && !SQLIT
177d0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
177e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
177f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
17800 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
17810 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
17830 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
17840 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
17850 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
17860 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17870 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
17880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
17890 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
178a0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
178b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
178c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
178d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
178e0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
178f0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
17900 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17930 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
17940 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
17950 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
17960 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
17970 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
17980 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
17990 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
179a0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
179b0 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
179c0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  ){.    memcpy(&p
179d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
179e0 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f  s, &((u8*)PGHDR_
179f0 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34  TO_DATA(pPg))[24
17a00 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
17a40 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17a50 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
17a60 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
17a70 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
17a80 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41  , 3);.  PAGERTRA
17a90 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61  CE4("FETCH %d pa
17aa0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
17ab0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17ac0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17ad0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
17ae0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
17af0 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Pg));.  return r
17b00 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
17b10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
17b20 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
17b30 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
17b40 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
17b50 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
17b60 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
17b70 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
17b80 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
17b90 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
17ba0 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
17bb0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
17bc0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69  op..**.** Immedi
17bd0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
17be0 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  ining the shared
17bf0 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72   lock (if requir
17c00 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ed), this functi
17c10 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72  on.** checks for
17c20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
17c30 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ile. If one is f
17c40 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e  ound, an emergen
17c50 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  cy rollback.** i
17c60 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65  s performed imme
17c70 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  diately..*/.stat
17c80 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
17c90 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
17ca0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
17cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
17cc0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17cd0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
17ce0 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
17cf0 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
17d00 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
17d10 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
17d20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
17d30 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
17d40 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
17d50 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
17d60 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
17d70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17d90 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
17da0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
17db0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
17dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17dd0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
17de0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
17df0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
17e00 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
17e10 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
17e20 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
17e30 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
17e40 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
17e50 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
17e60 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
17e70 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
17e80 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20   deleted..      
17e90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  */.      if( has
17ea0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
17eb0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
17ec0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
17ed0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
17ee0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
17ef0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
17f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
17f10 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
17f20 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
17f30 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
17f40 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
17f50 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
17f60 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
17f70 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
17f80 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
17f90 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
17fa0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
17fb0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
17fc0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
17fd0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
17fe0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
17ff0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
18000 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
18010 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
18020 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
18030 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
18040 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
18050 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
18060 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
18070 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
18080 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
18090 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
180a0 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
180b0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
180c0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
180d0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
180e0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
180f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
18100 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18110 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
18120 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
18130 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18140 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
18150 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
18160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18170 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18180 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
18190 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
181a0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
181b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
181c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
181d0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
181e0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
181f0 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a  VE;. .        /*
18200 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
18210 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
18220 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
18230 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
18240 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
18250 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
18260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
18270 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
18280 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
18290 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
182a0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
182b0 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
182c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
182d0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
182e0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
182f0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
18300 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20  e holds.        
18310 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
18320 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
18330 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
18340 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
18350 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
18360 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
18370 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
18380 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  e time..        
18390 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20  **..** Open the 
183a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
183b0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
183c0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
183d0 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65  n ..** exclusive
183e0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
183f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18400 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
18410 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  en and.        *
18420 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
18430 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
18440 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
18450 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
18460 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  .        ** OsTr
18470 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
18480 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
18490 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
184a0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
184b0 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
184c0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
184d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
184e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
184f0 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SY;.        if( 
18500 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
18510 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
18520 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
18530 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20     int ro;.     
18540 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
18550 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18560 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
18570 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
18580 61 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  adWrite(pPager->
18590 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
185a0 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20  r->jfd, &ro);.  
185b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
185c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
185d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a   pPager->jfd );.
185e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f            if( ro
185f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18600 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
18620 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
18630 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
18640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18650 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
18660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18670 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
18680 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
18690 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
186a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
186b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
186c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
186d0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
186e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
186f0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
18700 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
18710 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
18720 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
18730 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
18740 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
18750 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20  alHdr = 0;. .   
18760 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
18770 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
18780 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
18790 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
187a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  e.        ** loc
187b0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
187c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
187d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
187e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
187f0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
18800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18820 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18830 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
18840 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
18850 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
18860 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
18870 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
18880 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
18890 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
188a0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
188b0 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
188c0 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
188d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
188e0 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
188f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
18900 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
18910 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
18920 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
18930 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20  ase file.       
18940 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
18950 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
18960 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
18970 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
18980 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
18990 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
189a0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
189b0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
189c0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  se.        ** ha
189d0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
189e0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
189f0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
18a00 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20  lush the.       
18a10 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
18a20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
18a30 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
18a40 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
18a50 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
18a60 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
18a70 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66         ** at off
18a80 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
18a90 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
18aa0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
18ab0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ytes are.       
18ac0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
18ad0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
18ae0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
18af0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
18b00 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
18b10 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
18b20 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
18b30 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
18b40 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  n.        ** a c
18b50 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
18b60 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
18b70 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
18b80 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
18b90 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
18ba0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
18bb0 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  t be .        **
18bc0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
18bd0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
18be0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
18bf0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
18c00 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
18c10 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
18c20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18c30 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
18c40 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
18c50 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
18c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
18c70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
18c80 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
18c90 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18ca0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
18cb0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18cc0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
18cd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
18ce0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
18cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f   ){.          IO
18d00 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
18d10 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
18d20 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
18d30 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rs)));.         
18d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18d50 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
18d60 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
18d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18d90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
18dc0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
18dd0 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
18de0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
18df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
18e20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
18e30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
18e40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
18e50 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
18e60 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
18e70 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20  Vers));.        
18e80 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  }..        if( m
18e90 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
18ea0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
18eb0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
18ec0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
18ed0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
18ee0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
18ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18f00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18f10 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
18f20 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
18f30 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52  er->state<=PAGER
18f40 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
18f50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18f60 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
18f70 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18f80 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
18f90 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
18fa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18fb0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18fc0 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20  a PgHdr object. 
18fd0 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20    Either create 
18fe0 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75  a new one or reu
18ff0 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  se.** an existin
19000 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  g one that is no
19010 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  t otherwise in u
19020 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  se..**.** A new 
19030 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20  PgHdr structure 
19040 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e  is created if an
19050 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
19060 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a  ng are.** true:.
19070 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
19080 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65  e have not excee
19090 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20  ded our maximum 
190a0 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20  allocated cache 
190b0 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
190c0 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22   as set by the "
190d0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
190e0 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  e" command..**.*
190f0 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
19100 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50   are no unused P
19110 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61  gHdr objects ava
19120 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74  ilable at this t
19130 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ime..**.**     (
19140 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69  3)  This is an i
19150 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19160 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  e..**.**     (4)
19170 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50    There are no P
19180 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61  gHdr objects tha
19190 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
191a0 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20   a journal.**   
191b0 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63         file sync
191c0 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74   and a sync of t
191d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
191e0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
191f0 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69           prohibi
19200 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ted..**.** Other
19210 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65  wise, reuse an e
19220 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20  xisting PgHdr.  
19230 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19240 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73  reuse an.** exis
19250 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c  ting PgHdr if al
19260 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
19270 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
19280 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
19290 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65  ave reached or e
192a0 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69  xceeded the maxi
192b0 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  mum cache size.*
192c0 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77  *          allow
192d0 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61  ed by "PRAGMA ca
192e0 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a  che_size"..**.**
192f0 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
19300 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c  is a PgHdr avail
19310 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d  able with PgHdr-
19320 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20  >nRef==0.**.**  
19330 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e     (3)  We are n
19340 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ot in an in-memo
19350 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  ry database.**.*
19360 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65  *     (4)  Eithe
19370 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76  r there is an av
19380 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68  ailable PgHdr th
19390 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
193a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
193b0 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  be synced to dis
193c0 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73  k or else disk s
193d0 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e  yncing is curren
193e0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
193f0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74  allowed..*/.stat
19400 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
19410 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
19420 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
19430 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
19440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
19450 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
19460 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67   Create a new Pg
19470 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68  Hdr if any of th
19480 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e  e four condition
19490 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20  s defined .  ** 
194a0 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f  above is met: */
194b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
194c0 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
194d0 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
194e0 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20  ->pFirst==0 .   
194f0 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28  || MEMDB.   || (
19500 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
19510 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65  nced==0 && pPage
19520 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20  r->doNotSync).  
19530 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
19540 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72  r->nPage>=pPager
19550 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->nHash ){.     
19560 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
19570 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c  sh_table(pPager,
19580 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
19590 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35  ->nHash<256 ? 25
195a0 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  6 : pPager->nHas
195b0 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  h*2);.      if( 
195c0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30  pPager->nHash==0
195d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
195e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
195f0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
19600 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
19610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19620 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
19630 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
19640 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
19650 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
19680 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
19690 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
196c0 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
196d0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
196e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
196f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
19700 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
19710 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
19720 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
19730 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
19740 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19750 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
19760 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19770 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
19780 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
19790 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
197a0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
197b0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
197c0 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
197d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
197e0 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  ll = pPg;.    pP
197f0 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20  ager->nPage++;. 
19800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
19810 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69  ecycle an existi
19820 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a  ng page with a z
19830 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a  ero ref-count. *
19840 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
19850 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
19860 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69   1, &pPg);.    i
19870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
19880 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
19890 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
198a0 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
198b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
198c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
198d0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
198e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
198f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19900 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
19910 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
19920 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
19930 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
19940 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
19950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19960 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
19970 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
19980 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
19990 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
199a0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
199b0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
199c0 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
199d0 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
199e0 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
199f0 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
19a00 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
19a10 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
19a20 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
19a30 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
19a40 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
19a50 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
19a60 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
19a70 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
19a80 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
19a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19aa0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
19ab0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
19ac0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
19ad0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
19ae0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
19af0 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
19b00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
19b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19b20 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
19b30 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
19b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
19b50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19b70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19b80 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
19b90 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
19ba0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
19bb0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
19bc0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
19bd0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
19be0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
19bf0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
19c00 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
19c10 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
19c20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19c30 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
19c40 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
19c50 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
19c60 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
19c70 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
19c80 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
19c90 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
19ca0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
19cb0 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
19cc0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
19cd0 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
19ce0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
19cf0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
19d00 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
19d10 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
19d20 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
19d30 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
19d40 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
19d50 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
19d60 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
19d70 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
19d80 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
19d90 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
19da0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
19db0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
19dc0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
19dd0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
19de0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
19df0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
19e00 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
19e10 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
19e20 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
19e30 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
19e40 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
19e50 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
19e60 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
19e70 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
19e80 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
19e90 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
19ea0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
19eb0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
19ec0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
19ed0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
19ee0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
19ef0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
19f00 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
19f10 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
19f20 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
19f30 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
19f40 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
19f50 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
19f60 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
19f70 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
19f80 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
19f90 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
19fa0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
19fb0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
19fc0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
19fd0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
19fe0 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
19ff0 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
1a000 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
1a010 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
1a020 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
1a030 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
1a040 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1a050 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
1a060 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
1a070 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
1a080 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
1a090 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
1a0a0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1a0b0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
1a0c0 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
1a0d0 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
1a0e0 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
1a0f0 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
1a100 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1a110 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
1a120 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
1a130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a140 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1a150 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
1a160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
1a170 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
1a180 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
1a190 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
1a1a0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
1a1b0 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
1a1c0 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
1a1d0 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
1a1e0 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
1a1f0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
1a200 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1a210 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1a220 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1a230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a240 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1a250 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1a260 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1a270 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1a280 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1a290 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1a2a0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1a2b0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1a2c0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1a2d0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1a2e0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1a2f0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1a300 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1a310 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1a320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a330 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1a340 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
1a350 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
1a360 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1a370 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1a380 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1a390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1a3a0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1a3b0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1a3c0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1a3d0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1a3e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1a3f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1a400 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1a410 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1a420 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1a430 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a440 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1a450 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1a460 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1a470 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
1a480 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
1a490 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1a4a0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
1a4b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1a4c0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1a4d0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1a4e0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
1a4f0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1a500 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
1a510 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1a520 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
1a530 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
1a540 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
1a550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a560 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
1a570 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1a580 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
1a590 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
1a5a0 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
1a5b0 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
1a5c0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
1a5d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a5e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1a5f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1a600 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1a610 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1a620 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
1a630 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1a640 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1a650 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
1a660 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1a670 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
1a680 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1a690 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1a6a0 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
1a6b0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1a6c0 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
1a6d0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1a6e0 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
1a6f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a720 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
1a730 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
1a740 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
1a750 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
1a760 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
1a770 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a780 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
1a790 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a7a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
1a7b0 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
1a7c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a7d0 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
1a7e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a7f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1a800 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1a810 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
1a820 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
1a830 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
1a840 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
1a850 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
1a860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a870 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1a880 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1a890 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1a8a0 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43      }..    makeC
1a8b0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
1a8c0 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
1a8d0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
1a8e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1a8f0 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
1a900 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
1a910 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1a920 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
1a930 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
1a940 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
1a950 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
1a960 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1a970 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1a980 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
1a990 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
1a9a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1a9b0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63  f(pPg);.      rc
1a9c0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1a9d0 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  de;.      return
1a9e0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1a9f0 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
1aa00 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
1aa10 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
1aa20 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1aa30 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
1aa40 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
1aa50 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
1aa60 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
1aa70 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
1aa80 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
1aa90 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20  | (noContent && 
1aaa0 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
1aab0 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20  ollback) ){.    
1aac0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1aad0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1aae0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1aaf0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1ab00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ab10 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
1ab20 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1ab30 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1ab40 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
1ab50 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
1ab60 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
1ab70 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1ab80 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1ab90 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
1aba0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
1abb0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1abc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1abd0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1abe0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
1abf0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
1ac00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ac10 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1ac20 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1ac30 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
1ac40 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
1ac50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ac60 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1ac70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ac80 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e    }.      pPg->n
1ac90 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1aca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
1acb0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
1acc0 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
1acd0 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
1ace0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
1acf0 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
1ad00 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
1ad10 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1ad20 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
1ad30 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
1ad40 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1ad50 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
1ad60 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
1ad70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
1ad80 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
1ad90 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
1ada0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
1adb0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1adc0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1add0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1ade0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
1adf0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1ae00 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1ae10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ae20 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1ae30 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
1ae40 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
1ae50 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1ae60 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1ae70 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  1);.    PAGER_IN
1ae80 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
1ae90 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e  ;.    if( !noCon
1aea0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
1aeb0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1aec0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20  tent(pPg);.     
1aed0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1aee0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1aef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1af00 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1af10 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70   }.  *ppPage = p
1af20 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
1af30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1af40 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1af50 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1af60 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1af70 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1af80 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1af90 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1afa0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1afb0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1afc0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1afd0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1afe0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1aff0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1b000 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1b010 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1b020 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1b030 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1b040 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1b050 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1b060 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1b070 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1b080 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1b090 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1b0a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1b0b0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1b0c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1b0d0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1b0e0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1b0f0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1b100 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1b110 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1b120 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1b130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1b140 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1b150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b160 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1b170 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1b180 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b190 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1b1a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1b1b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
1b1c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1b1d0 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74  eMode );.    ret
1b1e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1b1f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b200 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1b210 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1b220 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1b230 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
1b240 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1b250 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1b260 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
1b270 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
1b280 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
1b290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
1b2a0 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
1b2b0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
1b2c0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1b2d0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
1b2e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
1b2f0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
1b300 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
1b310 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
1b320 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
1b330 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
1b340 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
1b350 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
1b360 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1b370 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
1b380 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b390 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
1b3a0 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20  ge *pPg){..  /* 
1b3b0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
1b3c0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1b3d0 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
1b3e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1b3f0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
1b400 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
1b410 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
1b420 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1b430 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
1b440 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1b450 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
1b460 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
1b470 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
1b480 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
1b490 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
1b4a0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
1b4b0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
1b4c0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1b4d0 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
1b4e0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1b4f0 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
1b500 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
1b510 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
1b520 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
1b530 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
1b540 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
1b550 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
1b560 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
1b570 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
1b580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1b590 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
1b5a0 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
1b5b0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
1b5c0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
1b5d0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
1b5e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1b5f0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
1b600 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
1b610 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1b620 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
1b630 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1b640 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
1b650 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1b660 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
1b670 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
1b680 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
1b690 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
1b6a0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1b6b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1b6c0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1b6d0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
1b6e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1b6f0 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
1b700 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1b710 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
1b720 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1b730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b740 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  f>0) ){.      pa
1b750 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1b760 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1b770 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b790 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1b7a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1b7b0 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1b7c0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1b7d0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1b7e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b7f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b800 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1b810 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b820 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1b830 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1b840 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1b850 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1b860 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1b870 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1b880 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1b890 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1b8a0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1b8b0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1b8c0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1b8d0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1b8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1b8f0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b900 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1b910 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b920 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1b930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b940 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1b950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b960 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1b970 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
1b980 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1b990 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
1b9a0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
1b9b0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1b9c0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1b9d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1b9e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1b9f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ba00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
1ba10 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1ba20 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1ba30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1ba40 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
1ba50 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
1ba60 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1ba90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
1baa0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1bab0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1bac0 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67  r->jfd );.  pPag
1bad0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1bae0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
1baf0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
1bb00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1bb10 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1bb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bb30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bb40 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
1bb50 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1bb60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1bb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
1bb80 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1bb90 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1bba0 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1bbb0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1bbc0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
1bbd0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
1bbe0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
1bbf0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1bc00 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
1bc10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
1bc20 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
1bc30 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
1bc40 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
1bc50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1bc60 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
1bc70 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1bc80 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
1bc90 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
1bca0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1bcb0 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
1bcc0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
1bcd0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1bce0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
1bcf0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1bd00 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1bd10 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1bd20 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
1bd30 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1bd40 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
1bd50 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1bd60 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
1bd70 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1bd80 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
1bd90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bda0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1bdb0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
1bdc0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1bdd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1bde0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1bdf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1be00 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1be10 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
1be20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1be30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1be40 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1be50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1be60 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
1be70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
1be80 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1be90 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
1bea0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1beb0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
1bec0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1bed0 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
1bee0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1bef0 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
1bf00 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
1bf10 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
1bf20 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
1bf30 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
1bf40 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1bf50 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
1bf60 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1bf70 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1bf80 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
1bf90 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1bfa0 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
1bfb0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1bfc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1bfd0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1bfe0 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
1bff0 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
1c000 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
1c010 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
1c020 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
1c030 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
1c040 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
1c050 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
1c060 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
1c070 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
1c080 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
1c090 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
1c0a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1c0b0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1c0c0 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
1c0d0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
1c0e0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1c0f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
1c110 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
1c120 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
1c130 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
1c140 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
1c150 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1c160 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
1c170 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1c180 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
1c190 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
1c1a0 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
1c1b0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
1c1c0 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
1c1d0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
1c1e0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
1c1f0 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
1c200 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c210 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
1c220 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
1c230 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
1c240 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
1c250 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1c260 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1c270 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
1c280 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
1c290 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1c2a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1c2b0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
1c2c0 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
1c2d0 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
1c2e0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
1c2f0 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
1c300 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
1c310 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
1c320 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
1c330 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
1c340 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
1c350 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1c360 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
1c370 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1c380 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
1c390 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
1c3a0 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
1c3b0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c3c0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1c3d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1c3e0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1c3f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c400 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1c410 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1c420 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1c430 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1c440 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c450 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c460 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
1c470 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
1c480 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1c490 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1c4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
1c4b0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1c4c0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
1c4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c4e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1c4f0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1c500 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
1c510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1c530 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1c540 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
1c550 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
1c560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c570 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1c580 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1c590 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1c5a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c5b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1c5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c5d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1c5f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c600 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1c610 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1c620 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1c630 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1c640 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1c650 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1c660 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c670 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1c680 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1c690 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1c6a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1c6b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c6c0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1c6d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1c6e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1c6f0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1c700 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1c710 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1c720 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
1c730 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1c740 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1c750 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1c760 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1c770 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1c780 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1c790 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1c7a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1c7b0 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1c7c0 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
1c7d0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1c7e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1c7f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1c800 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1c810 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1c820 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1c830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c840 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1c850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1c860 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1c870 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1c880 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
1c890 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1c8a0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1c8b0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1c8c0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1c8d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c8e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1c900 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1c910 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1c920 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1c930 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1c940 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1c950 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1c960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1c970 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1c980 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
1c990 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
1c9a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c9b0 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
1c9c0 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
1c9d0 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
1c9e0 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
1c9f0 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
1ca00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1ca10 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
1ca20 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1ca30 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
1ca40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1ca50 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1ca60 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1ca70 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1ca80 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
1ca90 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1caa0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1cab0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1cac0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1cad0 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
1cae0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
1caf0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1cb00 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
1cb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1cb20 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
1cb30 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
1cb40 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
1cb50 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
1cb60 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
1cb70 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1cb80 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
1cb90 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1cba0 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
1cbb0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1cbc0 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
1cbd0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
1cbe0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1cbf0 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
1cc00 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
1cc10 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1cc20 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1cc30 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
1cc40 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1cc50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cc60 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
1cc70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1cc80 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
1cc90 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
1cca0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1ccb0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1ccc0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1ccd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1cce0 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1ccf0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1cd00 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1cd10 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1cd20 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1cd30 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1cd40 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1cd50 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1cd60 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1cd70 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1cd80 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1cd90 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1cda0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1cdb0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1cdc0 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1cdd0 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1cde0 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1cdf0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1ce00 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1ce10 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1ce20 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1ce30 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1ce40 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1ce50 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1ce60 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1ce70 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1ce80 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ce90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1cea0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1ceb0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1cec0 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1ced0 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1cee0 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1cef0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1cf00 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1cf10 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1cf20 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1cf30 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1cf40 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1cf50 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1cf60 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1cf70 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1cf80 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1cf90 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1cfa0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1cfb0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1cfc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1cfd0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1cfe0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1cff0 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
1d000 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
1d010 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d020 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1d030 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1d040 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
1d050 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
1d060 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d070 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
1d080 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1d090 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1d0a0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
1d0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d0c0 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
1d0d0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1d0e0 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
1d0f0 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1d100 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
1d110 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
1d120 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
1d130 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
1d140 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
1d150 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
1d160 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
1d170 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d180 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
1d190 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
1d1a0 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
1d1b0 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
1d1c0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1d1d0 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
1d1e0 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
1d1f0 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
1d200 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
1d210 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
1d220 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
1d230 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
1d240 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
1d250 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
1d260 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
1d270 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1d280 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
1d290 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
1d2a0 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
1d2b0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
1d2c0 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1d2d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d2e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1d2f0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
1d300 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
1d310 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
1d320 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d330 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
1d340 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
1d350 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
1d360 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
1d370 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
1d380 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
1d390 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
1d3a0 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
1d3b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
1d3c0 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
1d3d0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1d3e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
1d3f0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
1d400 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
1d410 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1d420 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1d430 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
1d440 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1d450 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
1d460 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
1d470 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
1d480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1d490 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
1d4a0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1d4b0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
1d4c0 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
1d4d0 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
1d4e0 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
1d4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d500 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1d510 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
1d520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d530 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
1d540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d560 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d570 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d580 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1d590 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1d5a0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1d5b0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1d5c0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1d5d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d5e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1d5f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1d600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d610 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d620 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d640 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
1d650 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
1d660 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1d670 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
1d680 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1d690 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
1d6a0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
1d6b0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
1d6c0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1d6d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1d6e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1d6f0 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
1d700 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
1d710 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
1d720 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
1d730 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1d740 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
1d750 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
1d760 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1d770 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1d780 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
1d790 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
1d7a0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1d7b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1d7c0 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
1d7d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
1d7e0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
1d7f0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d800 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1d810 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1d820 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1d830 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
1d840 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1d850 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1d860 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1d870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
1d880 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
1d890 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1d8a0 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
1d8b0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1d8c0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1d8d0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1d8e0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1d8f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1d900 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1d910 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1d920 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d930 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1d940 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d950 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
1d960 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
1d970 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1d980 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  2, *pEnd;.      
1d990 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
1d9a0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
1d9b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d9c0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
1d9d0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
1d9e0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1d9f0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1da00 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1da10 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1da20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1da30 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1da40 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1da50 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
1da60 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
1da70 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
1da80 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1da90 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1daa0 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
1dab0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
1dac0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
1dad0 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
1dae0 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
1daf0 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
1db00 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
1db10 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
1db20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
1db30 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
1db40 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1db50 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
1db60 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
1db70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
1db80 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
1db90 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
1dba0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1dbb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1dbc0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1dbd0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
1dbe0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  Pg);.          I
1dbf0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
1dc00 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
1dc10 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1dc20 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1dc30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1dc40 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29  urnalOff, szPg))
1dc50 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1dc60 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1dc70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1dc80 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  t);.          pP
1dc90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1dca0 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
1dcb0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
1dcc0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1dcd0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
1dce0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1dd00 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1dd10 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1dd20 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
1dd30 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1dd40 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1dd50 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1dd60 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1dd70 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1dd80 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1dd90 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1dda0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1ddb0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1ddc0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1ddd0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1dde0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ddf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1de00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1de10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1de20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1de30 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1de40 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1de50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1de60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1de70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1de80 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1de90 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1dea0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1deb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1dec0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1ded0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1dee0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1def0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1df00 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1df10 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1df20 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1df30 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1df40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1df60 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
1df70 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
1df80 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1df90 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1dfa0 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
1dfb0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1dfc0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1dfd0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1dfe0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1dff0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e000 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1e010 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
1e020 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
1e030 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1e040 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1e050 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
1e060 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1e070 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
1e080 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1e090 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1e0a0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1e0b0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1e0c0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1e0d0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1e0e0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1e0f0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1e100 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1e110 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1e120 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1e130 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1e140 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1e150 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1e160 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1e170 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1e180 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1e190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e1a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e1b0 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
1e1c0 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1e1d0 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
1e1e0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1e1f0 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
1e200 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e210 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e220 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1e230 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1e240 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1e250 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1e260 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1e270 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1e280 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1e290 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e2a0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
1e2b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
1e2c0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
1e2d0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1e2e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1e2f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1e300 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1e310 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1e320 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
1e330 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1e340 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e350 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e360 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1e370 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1e380 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1e390 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1e3a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1e3b0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1e3c0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1e3d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e3e0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1e3f0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1e400 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1e410 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1e420 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1e430 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1e440 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e450 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1e460 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1e470 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1e480 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50  ze+4);.        P
1e490 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1e4a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1e4b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1e4c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1e4d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1e4e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1e500 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1e510 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e520 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1e530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1e540 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1e550 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1e560 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1e570 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1e580 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1e590 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e5a0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1e5b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
1e5c0 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
1e5d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e5e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1e5f0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
1e600 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
1e610 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
1e620 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1e630 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
1e640 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
1e650 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1e660 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
1e670 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1e680 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1e690 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
1e6a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e6b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e6c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1e6d0 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
1e6e0 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
1e6f0 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
1e700 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
1e710 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1e720 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1e730 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
1e740 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
1e750 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
1e760 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1e770 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1e780 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
1e790 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
1e7a0 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
1e7b0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1e7c0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
1e7d0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
1e7e0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
1e7f0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
1e800 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
1e810 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
1e820 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
1e830 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
1e840 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
1e850 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1e860 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
1e870 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
1e880 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
1e890 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1e8a0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1e8b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1e8c0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1e8d0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1e8e0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e8f0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
1e900 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
1e910 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
1e920 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e930 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  );..  if( !MEMDB
1e940 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
1e950 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1e960 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1e970 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1e980 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e990 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1e9a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1e9d0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1e9e0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1e9f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1ea00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ea20 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1ea30 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1ea40 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20  /.    int ii;.. 
1ea50 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
1ea60 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
1ea70 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
1ea80 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
1ea90 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
1eaa0 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
1eab0 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
1eac0 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
1ead0 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
1eae0 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
1eaf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eb00 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
1eb10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1eb20 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
1eb30 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
1eb40 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
1eb50 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
1eb60 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
1eb70 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
1eb80 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
1eb90 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
1eba0 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
1ebb0 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
1ebc0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
1ebd0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1ebe0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1ebf0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
1ec00 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
1ec10 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
1ec20 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
1ec30 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
1ec40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1ec50 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1ec60 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1ec70 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
1ec80 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
1ec90 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
1eca0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1ecb0 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
1ecc0 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
1ecd0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1ece0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
1ecf0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
1ed00 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1ed10 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
1ed20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1ed30 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
1ed40 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
1ed50 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
1ed60 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
1ed70 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
1ed80 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
1ed90 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1eda0 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
1edb0 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
1edc0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1edd0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1ede0 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  || pg==pPg->pgno
1edf0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
1ee00 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  g>pPager->origDb
1ee10 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72  Size || !(pPager
1ee20 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f  ->aInJournal[pg/
1ee30 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a  8]&(1<<(pg&7))).
1ee40 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20        ) {.      
1ee50 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
1ee60 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1ee70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
1ee80 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
1ee90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eea0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1eeb0 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1eec0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1eed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1eef0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1ef00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1ef10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ef20 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1ef30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1ef40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ef50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ef60 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
1ef70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1ef80 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
1ef90 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1efa0 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
1efb0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1efc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1efd0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1efe0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
1eff0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
1f000 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
1f010 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
1f020 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
1f030 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1f040 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
1f050 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
1f060 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
1f070 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
1f080 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
1f090 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
1f0a0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
1f0b0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
1f0c0 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
1f0d0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1f0e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
1f0f0 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
1f100 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1f110 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
1f120 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
1f130 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
1f140 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
1f150 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f160 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
1f170 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1f180 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
1f190 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1f1a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1f1b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1f1c0 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
1f1d0 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  &pPg);.  if( rc=
1f1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f1f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f200 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1f210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1f230 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65  mcpy(sqlite3Page
1f240 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70  rGetData(pPg), p
1f250 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1f260 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1f270 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f280 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  nref(pPg);.  }. 
1f290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f2a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
1f2b0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
1f2c0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
1f2d0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
1f2e0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
1f2f0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
1f300 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
1f310 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
1f320 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
1f330 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
1f340 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
1f350 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
1f360 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
1f370 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
1f380 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1f390 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
1f3a0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
1f3b0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
1f3c0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
1f3d0 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
1f3e0 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
1f3f0 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
1f400 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1f410 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
1f420 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
1f430 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
1f440 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
1f450 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1f460 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
1f470 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1f480 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1f490 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1f4a0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1f4b0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1f4c0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1f4d0 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1f4e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f4f0 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1f500 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1f510 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1f520 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1f530 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
1f540 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1f550 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
1f560 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
1f570 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
1f580 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1f590 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
1f5a0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
1f5b0 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
1f5c0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1f5d0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1f5e0 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
1f5f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
1f600 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
1f610 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1f620 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
1f630 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
1f640 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1f650 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
1f660 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
1f670 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
1f680 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
1f690 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
1f6a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f6b0 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
1f6c0 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
1f6d0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1f6e0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1f6f0 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1f700 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
1f710 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
1f720 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1f730 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1f740 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
1f750 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
1f760 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
1f770 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1f780 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
1f790 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1f7a0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1f7b0 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
1f7c0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1f7d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1f7e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
1f7f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
1f800 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  turn;.  pPg->alw
1f810 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1f820 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1f830 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
1f840 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
1f850 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f860 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1f870 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
1f880 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
1f890 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
1f8a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1f8b0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1f8c0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1f8d0 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1f8e0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1f8f0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1f900 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1f910 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1f920 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1f930 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1f940 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1f950 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1f960 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1f970 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1f980 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1f990 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1f9a0 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1f9b0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1f9c0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1f9d0 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1f9e0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1f9f0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1fa00 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1fa10 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1fa20 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1fa30 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1fa40 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1fa50 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1fa60 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1fa70 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1fa80 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1fa90 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1faa0 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1fab0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1fac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fad0 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1fae0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1faf0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1fb00 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1fb10 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1fb20 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1fb30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1fb40 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
1fb50 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1fb60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1fb70 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1fb80 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1fb90 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1fba0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1fbb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1fbc0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1fbd0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1fbe0 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1fbf0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1fc00 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1fc10 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1fc20 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1fc30 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1fc40 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1fc50 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1fc60 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1fc70 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1fc80 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1fc90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fca0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76  .**.** If we hav
1fcb0 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c  e not yet actual
1fcc0 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  ly read the cont
1fcd0 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65  ent of this page
1fce0 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64   (if.** the PgHd
1fcf0 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  r.needRead flag 
1fd00 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69  is set) then thi
1fd10 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61  s routine acts a
1fd20 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74  s a promise.** t
1fd30 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hat we will neve
1fd40 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74  r need to read t
1fd50 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1fd60 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a  in the future..*
1fd70 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61  * so the needRea
1fd80 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c  d flag can be cl
1fd90 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f  eared at this po
1fda0 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  int..*/.void sql
1fdb0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1fdc0 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1fdd0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1fde0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1fdf0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1fe00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1fe10 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1fe20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1fe30 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1fe40 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1fe50 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1fe60 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1fe70 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1fe80 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1fe90 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1fea0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1feb0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1fec0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1fed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fee0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1fef0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1ff00 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1ff10 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1ff20 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1ff30 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1ff40 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65   1;.    pPg->nee
1ff50 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69  dRead = 0;.    i
1ff60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1ff70 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1ff80 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1ff90 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1ffa0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1ffb0 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54      }.    PAGERT
1ffc0 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1ffd0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1ffe0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1fff0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20000 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
20010 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
20020 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
20030 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66  >pgno)).  }.  if
20040 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
20050 55 73 65 20 0a 20 20 20 26 26 20 21 70 61 67 65  Use .   && !page
20060 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
20070 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70 50 67   .   && (int)pPg
20080 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
20090 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20  stmtSize .  ){. 
200a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
200b0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
200c0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
200d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
200e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
200f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
20100 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
20110 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
20120 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
20130 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a  >pgno&7);.  }.}.
20140 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20150 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
20160 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
20170 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
20180 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
20190 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
201a0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
201b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
201c0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
201d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
201e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
201f0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
20200 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
20210 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
20220 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
20230 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b  angeCountDone ){
20240 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
20250 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
20260 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
20270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20280 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
20290 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
202a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
202b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
202c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
202d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
202e0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
202f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
20300 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f  urn rc;.  .    /
20310 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
20320 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
20330 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
20340 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
20350 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
20360 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20  dr, 24);.  .    
20370 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
20380 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
20390 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
203a0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
203b0 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
203c0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33  nter++;.    put3
203d0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47  2bits(((char*)PG
203e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48  HDR_TO_DATA(pPgH
203f0 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  dr))+24, change_
20400 63 6f 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20 20  counter);.  .   
20410 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
20420 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
20430 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
20440 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
20450 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
20460 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
20470 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
20480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20490 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
204a0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
204b0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
204c0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
204d0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
204e0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
204f0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
20500 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
20510 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
20520 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
20530 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
20540 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
20550 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
20560 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
20570 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
20580 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
20590 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
205a0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
205b0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
205c0 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
205d0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
205e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
205f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
20600 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
20610 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
20620 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
20630 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
20640 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
20650 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
20660 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
20670 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
20680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
20690 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
206a0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
206b0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
206c0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
206d0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
206e0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
206f0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
20700 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
20710 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
20720 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
20730 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
20740 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
20750 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
20760 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
20770 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
20780 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
20790 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
207a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
207b0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
207c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
207d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
207e0 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63  ter, Pgno nTrunc
207f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20800 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45  LITE_OK;..  PAGE
20810 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53  RTRACE4("DATABAS
20820 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
20830 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
20840 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
20850 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
20860 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
20870 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
20880 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
20890 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
208a0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
208b0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
208c0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
208d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
208e0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
208f0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
20900 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
20910 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
20920 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
20930 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
20940 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
20950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20970 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
20980 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20990 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
209a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
209b0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
209c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
209d0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
209e0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
209f0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
20a00 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
20a10 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
20a20 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
20a30 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
20a40 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
20a50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
20a60 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
20a70 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
20a80 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
20a90 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20aa0 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
20ab0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
20ac0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
20ad0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
20ae0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
20af0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20b00 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
20b10 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
20b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20b30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
20b40 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
20b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20b60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
20b70 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
20b80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
20b90 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
20ba0 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
20bb0 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
20bc0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
20bd0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
20be0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
20bf0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
20c00 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
20c10 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
20c20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
20c30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
20c40 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  o i;.        int
20c50 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
20c60 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a  J_PGNO(pPager);.
20c70 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
20c80 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
20c90 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
20ca0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
20cb0 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
20cc0 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
20cd0 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20   (1<<(i&7))) && 
20ce0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
20cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20d00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
20d10 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
20d20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
20d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
20d40 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
20d50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20d60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20d70 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
20d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20d90 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
20da0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20db0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20dc0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20de0 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
20df0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
20e00 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
20e10 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
20e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20e30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20e40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20e50 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
20e60 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
20e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20e80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
20e90 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
20ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20eb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20ec0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
20ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20ee0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
20ef0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
20f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20f10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20f20 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20f30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
20f40 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
20f50 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
20f60 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
20f70 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
20f80 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
20f90 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
20fa0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
20fb0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
20fc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20fd0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20fe0 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67  c_exit;.    pPag
20ff0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
21000 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
21010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21020 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
21030 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
21040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21050 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
21060 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d, 0);.    }.   
21070 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
21080 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
21090 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
210a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
210b0 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
210c0 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
210d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
210e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
210f0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
21100 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
21110 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
21120 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
21130 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
21140 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
21150 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
21160 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
21170 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
21180 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c    * lock to spil
21190 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
211a0 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
211b0 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
211c0 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73  .     * there is
211d0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
211e0 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
211f0 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20  tent, it's.     
21200 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
21210 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
21220 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
21230 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21240 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21250 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
21260 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
21270 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
21280 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
21290 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
212a0 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
212b0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
212c0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
212d0 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
212e0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
212f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
21300 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
21310 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
21320 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
21330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21340 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
21350 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
21360 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
21370 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
21380 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
21390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
213a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
213b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
213c0 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
213d0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
213e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
213f0 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  R;.  }.  PAGERTR
21400 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
21410 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21420 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
21430 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
21440 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
21450 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
21460 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
21470 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
21480 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
21490 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
214a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
214b0 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
214c0 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
214d0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
214e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
214f0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
21500 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
21510 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
21520 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
21530 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
21540 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
21550 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
21560 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
21570 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
21580 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
21590 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
215a0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
215b0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
215c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
215d0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
215e0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
215f0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
21600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21610 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
21620 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
21630 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
21640 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
21650 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
21660 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
21670 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
21680 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
21690 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
216a0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
216b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
216c0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
216d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
216e0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
216f0 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
21700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21710 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
21720 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
21730 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
21740 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
21750 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
21760 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61  er);.  return pa
21770 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
21780 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
21790 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
217a0 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
217b0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
217c0 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
217d0 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
217e0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
217f0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
21800 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
21810 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
21820 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
21830 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
21840 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
21850 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
21860 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
21870 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
21880 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
21890 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
218a0 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
218b0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
218c0 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
218d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
218e0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
218f0 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
21900 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
21910 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
21920 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
21930 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
21940 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
21950 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
21960 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
21970 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
21980 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
21990 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
219a0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
219b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
219c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
219d0 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
219e0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
219f0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
21a00 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
21a10 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
21a20 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
21a30 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
21a40 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
21a50 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
21a60 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
21a70 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
21a80 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
21a90 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
21aa0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
21ab0 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
21ac0 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
21ad0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
21ae0 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
21af0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
21b00 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
21b10 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
21b20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21b30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
21b40 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21b50 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
21b60 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
21b70 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
21b80 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
21b90 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
21ba0 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
21bb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
21bc0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
21bd0 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
21be0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
21bf0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
21c00 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
21c10 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
21c20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
21c30 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
21c40 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
21c50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21c60 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
21c70 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
21c80 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
21c90 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
21ca0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
21cb0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
21cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
21cd0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
21ce0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
21cf0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
21d00 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
21d10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
21d20 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c  er->xReiniter(p,
21d30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21d40 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
21d50 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
21d60 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
21d70 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
21d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
21d90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
21da0 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61  igDbSize;.    pa
21db0 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
21dc0 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
21dd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
21de0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
21df0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
21e00 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
21e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21e20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
21e30 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
21e40 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
21e50 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
21e60 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
21e70 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
21e80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21e90 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
21ea0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
21eb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
21ec0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
21ed0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21ee0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
21ef0 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
21f00 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
21f10 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
21f20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
21f30 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
21f40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21f50 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
21f60 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
21f70 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
21f80 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
21f90 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
21fa0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
21fb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
21fc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21fe0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
21ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
22000 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
22010 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
22020 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
22030 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
22040 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
22050 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
22060 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
22070 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
22080 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
22090 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
220a0 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
220b0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
220c0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
220d0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
220e0 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
220f0 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
22100 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
22110 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
22120 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22130 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
22140 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
22150 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
22160 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
22170 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
22180 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
22190 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
221a0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
221b0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
221c0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
221d0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
221e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
221f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
22200 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
22210 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
22220 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
22230 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22240 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
22250 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
22260 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
22270 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22280 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
22290 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
222a0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
222b0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
222c0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
222d0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
222e0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
222f0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
22300 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
22310 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
22320 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
22330 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
22340 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
22350 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
22360 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
22370 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
22380 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
22390 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
223a0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
223b0 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
223c0 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
223d0 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
223e0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
223f0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
22400 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
22410 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
22420 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
22430 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
22440 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
22450 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
22460 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
22470 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
22480 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
22490 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
224a0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
224b0 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
224c0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
224d0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
224e0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
224f0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
22500 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
22510 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
22520 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
22530 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
22540 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
22550 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
22560 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
22570 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22580 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
22590 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
225a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
225b0 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
225c0 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
225d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
225e0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
225f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
22600 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
22610 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
22620 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
22630 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
22640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22650 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
22660 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
22670 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22680 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
22690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
226a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
226b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
226c0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
226d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
226e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
226f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
22700 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
22710 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
22720 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
22730 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
22740 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
22750 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
22760 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
22770 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
22780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22790 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
227a0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
227b0 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
227c0 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
227d0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
227e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
227f0 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
22800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22810 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
22820 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
22830 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22840 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
22850 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
22860 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
22870 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
22880 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
22890 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
228a0 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
228b0 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
228c0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
228d0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
228e0 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74  temp(&pPager->st
228f0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
22900 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
22910 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
22920 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
22930 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
22940 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
22950 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
22960 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
22970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22980 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
22990 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
229a0 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
229b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
229c0 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
229d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
229e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
229f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22a00 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
22a10 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
22a20 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
22a30 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22a40 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
22a50 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
22a60 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
22a70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54  Next;.    PAGERT
22a80 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
22a90 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
22aa0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
22ab0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
22ac0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
22ad0 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
22ae0 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
22af0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
22b00 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
22b10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22b20 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
22b30 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
22b40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
22b50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
22b60 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
22b70 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
22b80 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
22b90 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
22ba0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
22bb0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
22bc0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  r);.        pNex
22bd0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
22be0 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73  Stmt;.        as
22bf0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53  sert( pHist->inS
22c00 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  tmt );.        p
22c10 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
22c20 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
22c30 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
22c40 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
22c50 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
22c60 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
22c70 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
22c80 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
22c90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22ca0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
22cb0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
22cc0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
22cd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
22ce0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
22cf0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
22d00 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
22d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22d20 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
22d30 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
22d40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
22d50 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  tmtRollback(Page
22d60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
22d70 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
22d80 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
22d90 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
22da0 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
22db0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
22dc0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
22dd0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
22de0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
22df0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
22e00 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
22e10 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
22e20 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
22e30 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
22e40 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
22e50 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
22e60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
22e70 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
22e80 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
22e90 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
22ea0 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
22eb0 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
22ec0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22ed0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
22ee0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
22ef0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
22f00 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
22f10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22f20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
22f30 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
22f40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
22f50 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
22f60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
22f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f90 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
22fa0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
22fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22fc0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
22fd0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
22fe0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
22ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
23000 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
23010 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
23020 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23030 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
23040 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
23050 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
23060 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
23070 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
23080 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
23090 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
230a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
230b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
230c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
230d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
230e0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
230f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
23100 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
23110 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
23120 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
23130 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
23140 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
23150 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
23160 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
23170 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
23180 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
23190 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
231a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
231b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
231c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
231d0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
231e0 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
231f0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
23200 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
23210 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
23220 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
23230 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
23240 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
23250 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
23260 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
23270 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
23280 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
23290 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
232a0 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
232b0 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
232c0 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
232d0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
232e0 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
232f0 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
23300 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
23310 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
23320 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
23330 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
23340 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
23350 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
23360 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
23370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
23380 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
23390 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
233a0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
233b0 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  n the file. .**.
233c0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
233d0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
233e0 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
233f0 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
23400 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
23410 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
23420 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
23430 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
23440 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
23450 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
23460 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20  ious located at 
23470 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
23480 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
23490 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
234a0 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
234b0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
234c0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
234d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
234e0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
234f0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
23500 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
23510 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
23520 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
23530 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
23540 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
23550 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
23560 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
23570 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
23580 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
23590 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
235a0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
235b0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
235c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
235d0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
235e0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
235f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
23600 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
23610 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
23620 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
23630 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
23640 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
23650 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
23660 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
23670 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
23680 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
23690 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
236a0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
236b0 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
236c0 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
236d0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
236e0 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61  gOld;  /* The pa
236f0 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
23700 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68  tten. */.  int h
23710 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
23720 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  cPgno = 0;..  as
23730 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
23740 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  0 );..  PAGERTRA
23750 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
23760 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
23770 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
23780 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
23790 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
237a0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
237b0 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f  ync, pgno);.  IO
237c0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
237d0 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
237e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
237f0 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74  o))..  pager_get
23800 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
23810 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
23820 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
23830 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
23840 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
23850 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
23860 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
23870 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
23890 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
238a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
238b0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
238c0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
238d0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
238e0 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
238f0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
23900 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
23910 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
23920 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
23930 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
23940 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
23950 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
23960 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
23970 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
23980 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
23990 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
239a0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
239b0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
239c0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
239d0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
239e0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
239f0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
23a00 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
23a10 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
23a20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
23a30 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
23a40 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
23a50 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
23a60 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
23a70 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
23a80 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
23a90 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
23aa0 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
23ab0 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65  nc = pPgOld->nee
23ac0 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dSync;.  }else{.
23ad0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
23ae0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 0;.  }.  if(
23af0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
23b00 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
23b10 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
23b20 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Size ){.    pPg-
23b30 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70  >inJournal =  (p
23b40 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
23b50 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
23b60 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
23b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
23b80 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
23b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
23ba0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20  >needSync==0 || 
23bb0 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
23bc0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
23bd0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
23be0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
23bf0 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
23c00 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
23c10 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
23c20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
23c30 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
23c40 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
23c50 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
23c60 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
23c70 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
23c80 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
23c90 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
23ca0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
23cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
23cc0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
23cd0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
23ce0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
23cf0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
23d00 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
23d10 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
23d20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
23d30 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
23d40 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
23d50 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
23d60 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
23d70 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
23d80 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
23d90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
23da0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23db0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
23dc0 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
23dd0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
23de0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
23df0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
23e00 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
23e10 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
23e20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
23e30 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
23e40 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
23e50 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
23e60 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
23e70 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
23e80 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
23e90 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
23ea0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
23eb0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
23ec0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
23ed0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
23ee0 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
23ef0 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
23f00 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
23f10 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
23f20 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
23f30 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
23f40 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
23f50 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
23f60 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
23f70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50     int rc;.    P
23f80 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
23f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23fa0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
23fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23fc0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
23fd0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
23fe0 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
23ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
24000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
24010 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
24020 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
24030 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
24040 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
24050 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
24060 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
24070 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24080 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
24090 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
240a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
240b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
240c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
240d0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
240e0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
240f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
24100 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
24110 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
24120 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
24130 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
24140 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24150 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
24160 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
24170 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
24180 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
24190 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
241a0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
241b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
241c0 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
241d0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
241e0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
241f0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
24200 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
24210 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
24220 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
24230 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
24240 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
24250 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
24260 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
24270 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
24280 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
24290 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
242a0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
242b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
242c0 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
242d0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
242e0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
242f0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
24300 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
24310 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
24320 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
24330 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
24340 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
24350 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
24360 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
24370 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
24380 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
24390 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
243a0 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
243b0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
243c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
243d0 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
243e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
243f0 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
24400 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
24410 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
24420 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
24430 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
24440 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
24450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
24460 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
24470 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
24480 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
24490 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
244a0 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
244b0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
244c0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
244d0 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
244e0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
244f0 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
24500 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
24510 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
24520 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
24530 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
24540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24550 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
24560 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
24570 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
24580 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
24590 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
245a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
245b0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
245c0 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
245d0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
245e0 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
245f0 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
24600 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
24610 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
24620 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
24630 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
24640 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
24650 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
24660 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
24670 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
24680 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
24690 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
246a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
246b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
246c0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
246d0 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
246e0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
246f0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
24700 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24710 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
24720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24730 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
24740 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
24750 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
24760 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
24770 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
24780 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24790 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
247a0 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
247b0 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
247c0 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
247d0 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
247e0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
247f0 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
24800 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
24810 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
24820 4f 20 2a 2f 0a                                   O */.