/ Hex Artifact Content
Login

Artifact cd2770b0f8bd1900b46121009336e7ad03fb274f:


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 33  : pager.c,v 1.33
0350: 30 20 32 30 30 37 2f 30 34 2f 32 36 20 31 32 3a  0 2007/04/26 12:
0360: 31 31 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  11:28 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61   */.  int nMaxPa
2f80: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f90: 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20    /* High water 
2fa0: 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f  mark of nPage */
2fb0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
2fe0: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
2ff0: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3000: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3030: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3040: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3050: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3070: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3080: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3090: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
30a0: 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20  8 *aInStmt;     
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30c0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
30d0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
30e0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
30f0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
3100: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3120: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
3130: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3140: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3160: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
3170: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
3180: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
3190: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
31a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a    OsFile *fd, *j
31c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
31f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
3200: 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  OsFile *stfd;   
3210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3230: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
3240: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
3250: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3260: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
3270: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
3280: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
3290: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c    PgHdr *pFirst,
32a0: 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a   *pLast;      /*
32b0: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   List of free pa
32c0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
32d0: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20  pFirstSynced;   
32e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72       /* First fr
32f0: 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48  ee page with PgH
3300: 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a  dr.needSync==0 *
3310: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
3340: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3350: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
3380: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
3390: 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  al */.  PgHdr *p
33a0: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
33b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
33c0: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a  ll dirty pages *
33d0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
33e0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
33f0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
3400: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
3410: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3420: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3440: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
3450: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
3460: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73  eader */.  i64 s
3470: 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20  tmtHdrOff;      
3480: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
34a0: 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74  ritten this stat
34b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73  ement */.  i64 s
34c0: 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20  tmtCksum;       
34d0: 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49         /* cksumI
34e0: 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65  nit when stateme
34f0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a  nt was started *
3500: 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a  /.  i64 stmtJSiz
3510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3520: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
3530: 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  al at stmt_begin
3540: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74  () */.  int sect
3550: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
3560: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
3570: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
3580: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69  g rollback */.#i
3590: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
35a0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
35b0: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
35c0: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
35d0: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
35e0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
35f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3600: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
3610: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
3620: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  if.  void (*xDes
3630: 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a  tructor)(DbPage*
3640: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
3650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3660: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
3670: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
3680: 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  iter)(DbPage*,in
3690: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
36a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
36b0: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
36c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36d0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
36e0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
36f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3700: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3710: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3720: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3730: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3740: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3750: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3760: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
3770: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3790: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
37a0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
37b0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
37d0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
37e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
37f0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
3800: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3810: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
3820: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3850: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3860: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3870: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
3880: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3890: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
38a0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
38b0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
38c0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
38d0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
38e0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
38f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3900: 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  anges */.};../*.
3910: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3920: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3930: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3940: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3950: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3960: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3970: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3980: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3990: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
39a0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
39b0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
39c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
39d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
39e0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
39f0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3a00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3a10: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3a20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3a40: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3a50: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3a60: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3a70: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a80: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3a90: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3aa0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ab0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3ac0: 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nal */.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   Number of cache
3b00: 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a   pages freed */.
3b10: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3b20: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
3b30: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
3b40: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
3b50: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
3b60: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3b70: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3b90: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3ba0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3bb0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3bc0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3bd0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3be0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3bf0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3c00: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3c10: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3c20: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3c30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3c40: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3c50: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3c60: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
3c70: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3c80: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3c90: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3ca0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3cb0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3cc0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3cd0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3ce0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3cf0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3d00: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3d10: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3d20: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3d30: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3d40: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3d50: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3d60: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3d70: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3d80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3d90: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3da0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3db0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3dc0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3dd0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3de0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3df0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3e00: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3e10: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3e20: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3e30: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3e40: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3e50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3e60: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3e70: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3e80: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3e90: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3ea0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3eb0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3ed0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3ee0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3ef0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3f00: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3f10: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3f20: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3f30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3f40: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3f50: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3f60: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3f70: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3f80: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3f90: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3fa0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3fb0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3fc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3fd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3fe0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
3ff0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
4000: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
4010: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
4020: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
4030: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
4040: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
4050: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
4060: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
4070: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4080: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
4090: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
40a0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
40b0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
40c0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
40d0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
40e0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
40f0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
4100: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
4110: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
4120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
4130: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
4140: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
4150: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
4160: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
4170: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
4180: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
4190: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
41a0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
41b0: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
41c0: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
41d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
41e0: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
41f0: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
4200: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
4210: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
4220: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
4230: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
4240: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
4250: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
4260: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
4270: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
4280: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
4290: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
42a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
42b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
42c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
42d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
42e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
42f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
4300: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
4310: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
4320: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
4330: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
4340: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
4350: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
4360: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
4370: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
4380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4390: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
43a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
43b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
43c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
43d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  dif../*.** Page 
43e0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
43f0: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
4400: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
4410: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
4420: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
4430: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
4440: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
4450: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
4460: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
4470: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
4480: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
4490: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
44a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
44b0: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
44c0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
44d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
44e0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
44f0: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
4500: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
4510: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
4520: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
4530: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
4540: 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65  tails..*/./* #de
4550: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4560: 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42  NO(x) (PENDING_B
4570: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
4580: 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ze)) */.#define 
4590: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
45a0: 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f   ((PENDING_BYTE/
45b0: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
45c0: 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  +1)../*.** The m
45d0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
45e0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
45f0: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
4600: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
4610: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
4620: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
4630: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
4640: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
4650: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
4660: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
4670: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
4680: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
4690: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
46a0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
46b0: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
46c0: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
46d0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
46e0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
46f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
4700: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4710: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
4720: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
4730: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
4740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4750: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4760: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
4770: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
4780: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4790: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
47a0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
47b0: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
47c0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
47d0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
47e0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47f0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
4800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4810: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
4820: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
4830: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
4840: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
4850: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
4860: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
4870: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
4880: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
4890: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
48a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
48b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48c0: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
48d0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
48e0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
48f0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
4900: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
4910: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
4920: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
4930: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
4940: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
4950: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
4960: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
4970: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
4980: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
4990: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
49a0: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
49b0: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
49c0: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
49d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
49e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
49f0: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
4a00: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
4a10: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
4a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a30: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
4a40: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
4a50: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
4a60: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
4a70: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
4a80: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
4a90: 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20  )==0 );.  aHash 
4aa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4ab0: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
4ac0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
4ad0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
4ae0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
4af0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4b00: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
4b10: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
4b20: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4b30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
4b40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
4b50: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
4b60: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
4b70: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
4b80: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4b90: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4ba0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
4bb0: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
4bc0: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
4bd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4be0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
4bf0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
4c00: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
4c10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
4c20: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
4c30: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
4c40: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
4c50: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
4c60: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
4c70: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
4c80: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
4c90: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
4ca0: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
4cb0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
4cc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4cd0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
4ce0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
4cf0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4d00: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
4d10: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4d20: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4d30: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d40: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4d50: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
4d60: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
4d70: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4d80: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
4d90: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
4da0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
4db0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
4dc0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
4dd0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4de0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
4df0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4e00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
4e10: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
4e20: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a  c, sizeof(ac));.
4e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
4e50: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4e60: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4e70: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4e80: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
4e90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4ea0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4eb0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4ec0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4ed0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4ee0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4ef0: 64 20 70 75 74 33 32 62 69 74 73 28 63 68 61 72  d put32bits(char
4f00: 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *ac, u32 val){.
4f10: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4f20: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4f30: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4f40: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4f50: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4f60: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4f70: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4f80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4f90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4fa0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4fb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4fc0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4fd0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4fe0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ff0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5000: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5010: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5020: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5030: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5040: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5050: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5060: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5070: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5080: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5090: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
50a0: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
50b0: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
50c0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
50d0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
50e0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
50f0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
5100: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
5110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5120: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
5130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
5140: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
5150: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
5160: 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c  rn (ac[0]<<24) |
5170: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
5180: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
5190: 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ];.}.../*.** Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
51b0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
51c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
51d0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
51e0: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
51f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
5200: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5210: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
5220: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
5230: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
5240: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
5250: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
5260: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
5270: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5280: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
5290: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52a0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
52b0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
52c0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52d0: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
52e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
52f0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
5300: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
5310: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
5320: 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65  stent. All subse
5330: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
5340: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a  on this Pager.**
5350: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
5360: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
5370: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
5380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5390: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
53a0: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
53b0: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
53c0: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
53d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
53e0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
53f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5400: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
5410: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
5420: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
5430: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
5440: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
5450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
5460: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
5470: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
5480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
54a0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
54b0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
54c0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
54d0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
54e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
54f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5500: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5510: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
5520: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
5530: 64 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20  d char *pData = 
5540: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5550: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
5560: 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Page);.  for(i=0
5570: 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65  ; i<pPage->pPage
5580: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b  r->pageSize; i++
5590: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
55a0: 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b  ash+i)^pData[i];
55b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
55c0: 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  sh;.}../*.** The
55d0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
55e0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
55f0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5600: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
5610: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
5620: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
5630: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
5640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
5650: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
5660: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
5670: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
5680: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
5690: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
56a0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
56b0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
56c0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
56d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
56e0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
56f0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
5700: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5710: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
5720: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
5730: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
5740: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
5750: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
5760: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
5770: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
5780: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
5790: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
57a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
57b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
57c0: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
57d0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
57e0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
57f0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
5800: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5810: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
5820: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
5830: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
5840: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
5850: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
5860: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
5870: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
5880: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
5890: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
58a0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
58b0: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
58c0: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
58d0: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
58e0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
58f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5900: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
5910: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
5920: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
5930: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5950: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
5960: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
5970: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
5980: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
5990: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
59a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
59b0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
59c0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
59d0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
59e0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
59f0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
5a00: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
5a10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5a20: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
5a30: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
5a40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
5a50: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
5a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5a70: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5a80: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
5a90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5aa0: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
5ab0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5ac0: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
5ad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5ae0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5af0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5b00: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
5b10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5b20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5b30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5b40: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
5b50: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
5b60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
5b70: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5b80: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
5b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5bb0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
5bc0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5be0: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
5bf0: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
5c00: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
5c10: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
5c20: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
5c30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5c40: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5c50: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
5c60: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
5c70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5c80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5c90: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
5ca0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5cb0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5cc0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
5cd0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5ce0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5cf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5d00: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
5d10: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
5d20: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
5d30: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
5d40: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
5d50: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
5d60: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
5d70: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
5d80: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
5d90: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
5da0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5db0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5dc0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5dd0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5de0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5df0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5e00: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
5e10: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
5e20: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
5e30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5e40: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
5e50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
5e60: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
5e70: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
5e80: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
5e90: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
5ea0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5ed0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5ee0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5ef0: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5f00: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5f10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5f20: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5f30: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5f40: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
5f50: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5f60: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5f70: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5f80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5f90: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5fa0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5fb0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5fc0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5ff0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6000: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
6010: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
6020: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
6030: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
6040: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6050: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
6070: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
6080: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
60b0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
60c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
60d0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
60e0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
60f0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
6100: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
6110: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6120: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
6130: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6140: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6150: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6160: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6170: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6180: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6190: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
61a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
61b0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
61c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
61d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
61e0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
61f0: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
6200: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6210: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6220: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6230: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6240: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
6250: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6260: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
6270: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6280: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
6290: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
62a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
62b0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
62c0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
62d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
62e0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
62f0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
6300: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
6310: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
6320: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
6330: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
6340: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
6350: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
6360: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
6370: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
6380: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
6390: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
63a0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
63b0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
63c0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
63d0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
63e0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
63f0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
6400: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
6410: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
6420: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
6430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6440: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6460: 20 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73    char zHeader[s
6470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6480: 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20  gic)+16];.  int 
6490: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
64a0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
64b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
64c0: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
64d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
64e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65  .  }..  rc = see
64f0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6500: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6510: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6530: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6540: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
6550: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58  ager);..  /* FIX
6580: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
6590: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
65a0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
65b0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
65c0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
65d0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
65e0: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
65f0: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
6600: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
6610: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
6620: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
6630: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
6640: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6650: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
6660: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
6670: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
6680: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
6690: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
66a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
66b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
66c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54  lMagic));.  /* T
66d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
66e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
66f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
6700: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6710: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6720: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
6730: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
6740: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
6750: 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ;.  /* The rando
6760: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6770: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6780: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6790: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
67a0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
67b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
67c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
67f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6800: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
6810: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
6820: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
6830: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6840: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6850: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
6860: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
6870: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
6880: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
6890: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
68a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
68b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
68c0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
68d0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
68e0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
68f0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
6900: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
6910: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
6920: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
6930: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6940: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
6950: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
6960: 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68  ader));..  /* Th
6970: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6980: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
6990: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
69a0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
69b0: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
69c0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
69d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
69e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
69f0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49  LITE_OK ){.    I
6a10: 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25  OTRACE(("JTAIL %
6a20: 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
6a30: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
6a40: 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63  alOff-1)).    rc
6a50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6a60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
6a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a80: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  -1);.    if( rc=
6a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6aa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ab0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6ac0: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
6ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6ae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6af0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6b00: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6b10: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
6b20: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
6b30: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
6b40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6b50: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
6b60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6b70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
6b80: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
6b90: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6ba0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
6bb0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
6bc0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
6bd0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
6be0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
6bf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
6c00: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
6c10: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
6c20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6c30: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
6c40: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
6c50: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
6c60: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
6c70: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
6c80: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
6c90: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
6ca0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
6cb0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
6cc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
6cd0: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
6ce0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
6cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6d00: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
6d10: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
6d20: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
6d30: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
6d40: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
6d50: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
6d60: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
6d70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
6d80: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
6d90: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
6da0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
6db0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
6dc0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
6dd0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
6de0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
6df0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6e00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6e10: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
6e20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
6e30: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
6e40: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
6e50: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
6e60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
6e70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
6e80: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
6e90: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6ea0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6eb0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6ec0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6ed0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6ee0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  n rc;..  if( pPa
6ef0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
6f00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6f10: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
6f20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
6f30: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6f40: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
6f50: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
6f60: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
6f70: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
6f80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6f90: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
6fa0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6fb0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
6fc0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6fe0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6ff0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7000: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52  pPager->jfd, pNR
7010: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
7020: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7030: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7040: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
7050: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7060: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7070: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
7080: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
7090: 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a  >jfd, pDbSize);.
70a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
70b0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
70c0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
70d0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
70e0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
70f0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
7100: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
7110: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
7120: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7130: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7140: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7150: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7160: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7170: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
7180: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
7190: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
71a0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
71b0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
71c0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
71d0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
71e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
71f0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
7200: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7210: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7220: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
7230: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
7240: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7250: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
7270: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7280: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
7290: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
72a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
72b0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
72c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
72d0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
72e0: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
72f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
7300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
7310: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
7320: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
7330: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
7340: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7350: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
7360: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
7370: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
7380: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
7390: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
73a0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
73b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
73c0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
73d0: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
73e0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
73f0: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
7400: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
7410: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
7420: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
7430: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
7440: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
7450: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
7460: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7470: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
7480: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
7490: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
74a0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
74b0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
74c0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
74d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
74e0: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
74f0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
7500: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
7510: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
7520: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
7530: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
7540: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
7550: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
7560: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
7570: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
7580: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
7590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
75a0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
75b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
75c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
75d0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
75e0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
75f0: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
7600: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
7610: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
7620: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
7630: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
7640: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
7650: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
7660: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
7670: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
7680: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
7690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
76a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
76b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
76c0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
76d0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
76e0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
76f0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
7700: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
7710: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
7720: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7730: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
7740: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
7750: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
7760: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
7770: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
7780: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
7790: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
77a0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
77b0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
77c0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
77d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
77e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
77f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
7800: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
7810: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
7820: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
7830: 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d  er->jfd, PAGER_M
7840: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
7850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7860: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7870: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7880: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7890: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
78a0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
78b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
78c0: 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69  n rc;..  put32bi
78d0: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
78e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
78f0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7900: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7910: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7920: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7930: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7940: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7950: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7960: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7970: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67  lMagic));.  pPag
7980: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
7990: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
79a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
79b0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
79c0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
79d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
79e0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
79f0: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
7a00: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
7a10: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
7a20: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
7a30: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
7a40: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7a50: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
7a60: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
7a70: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
7a80: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
7a90: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
7aa0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
7ab0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
7ac0: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
7ad0: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
7ae0: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
7af0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
7b00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
7b10: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
7b20: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
7b30: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
7b40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
7b50: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
7b60: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
7b70: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
7b80: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
7b90: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
7ba0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
7bb0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
7bc0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7bd0: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
7be0: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
7bf0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
7c00: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
7c10: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
7c20: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
7c30: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
7c40: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
7c50: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
7c60: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
7c70: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7c80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7c90: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
7ca0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
7cb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
7cc0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7cd0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
7ce0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
7cf0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
7d00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7d10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
7d20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
7d30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7d40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7d50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7d60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7d70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
7d80: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
7d90: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
7da0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
7db0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
7dc0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
7dd0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
7de0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7df0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
7e00: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
7e10: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7e20: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
7e30: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
7e40: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
7e50: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
7e60: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
7e70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
7e80: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
7e90: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7ea0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7eb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
7ec0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
7ed0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
7ee0: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
7ef0: 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70  er)).    }.    p
7f00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f10: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
7f20: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
7f30: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
7f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
7f50: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
7f60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7f70: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
7f80: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
7f90: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
7fa0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7fb0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
7fc0: 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74  ady entered.** t
7fd0: 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a  he error-state..
7fe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7ff0: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
8000: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b  lback(Pager *p){
8010: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
8020: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  e ) return;.  as
8030: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
8040: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
8050: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
8060: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
8070: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
8080: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
8090: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
80a0: 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  k(p);.  }.  page
80b0: 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61  r_unlock(p);.  a
80c0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
80d0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
80e0: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
80f0: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
8100: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
8110: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
8120: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
8130: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
8140: 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a  veMode );.}.../*
8150: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
8160: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
8170: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
8180: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
8190: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
81a0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
81b0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
81c0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
81d0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
81e0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
81f0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
8200: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
8210: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
8220: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
8230: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
8240: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
8250: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
8260: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8270: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
8280: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
8290: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
82a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
82b0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
82c0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
82d0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50  .    IOTRACE(("P
82e0: 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
82f0: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
8300: 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  o));.    PAGER_I
8310: 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
8320: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
8330: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
8340: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
8350: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
8360: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
8370: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
8380: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
8390: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
83a0: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
83b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
83c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
83d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
83e0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
83f0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
8400: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
8410: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
8420: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b  ager->aHash = 0;
8430: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
8440: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
8450: 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
8460: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
8470: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
8480: 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72   ended by either
8490: 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  .** a COMMIT or 
84a0: 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  a ROLLBACK..**.*
84b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
84c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
84d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
84e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
84f0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
8500: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
8510: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
8520: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
8530: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61  utine will relea
8540: 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  se.** the databa
8550: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
8560: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
8570: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20  ck in its place 
8580: 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68  if that is.** th
8590: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68  e appropriate th
85a0: 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65  ing to do.  Rele
85b0: 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c  ase locks usuall
85c0: 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  y is appropriate
85d0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61  ,.** unless we a
85e0: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
85f0: 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75  access mode or u
8600: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
8610: 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42  .** COMMIT AND B
8620: 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EGIN or ROLLBACK
8630: 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61   AND BEGIN opera
8640: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
8650: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
8660: 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f  either deleted o
8670: 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a  r truncated..**.
8680: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
8690: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
86a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
86b0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
86c0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
86d0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
86e0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
86f0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
8700: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
8710: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
8720: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
8730: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
8740: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
8750: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
8760: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8770: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
8780: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8790: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
87a0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  K;.  assert( !ME
87b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
87c0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
87d0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
87e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
87f0: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
8800: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
8810: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8820: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8830: 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
8840: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8850: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8860: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
8870: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8880: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
8890: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
88a0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69  nalOpen ){.    i
88b0: 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
88c0: 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20  siveMode .      
88d0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
88e0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
88f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d  Pager->jfd, 0))=
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20  =SQLITE_OK ){;. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8920: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
8930: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
8940: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8950: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8960: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8970: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8990: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
89a0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
89b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
89c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
89d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
89f0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
8a00: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
8a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8a20: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
8a30: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
8a40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
8a50: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8a60: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8a70: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
8a80: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
8a90: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
8aa0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
8ab0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8ac0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
8ad0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
8ae0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
8af0: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
8b00: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8b10: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8b20: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8b30: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
8b40: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
8b50: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
8b60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
8b70: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
8b80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
8b90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8ba0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8bb0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8bc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8bd0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8be0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8bf0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8c00: 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
8c10: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8c20: 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  e ){.    rc2 = s
8c30: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
8c40: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
8c50: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
8c60: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8c70: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
8c80: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
8c90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
8ca0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
8cb0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8cc0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
8cd0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8ce0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8cf0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8d00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8d10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
8d20: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8d30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
8d40: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  t;.  pPager->dbS
8d50: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74  ize = -1;..  ret
8d60: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
8d70: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
8d80: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
8d90: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
8da0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
8db0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
8dc0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
8dd0: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
8de0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
8df0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
8e00: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
8e10: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
8e20: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
8e30: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
8e40: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
8e50: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
8e60: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
8e70: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
8e80: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
8e90: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8ea0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
8eb0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8ec0: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
8ed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
8ee0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
8ef0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
8f00: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
8f10: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
8f20: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
8f30: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
8f40: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
8f50: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
8f60: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
8f70: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
8f80: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
8f90: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
8fa0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
8fb0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
8fc0: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
8fd0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
8fe0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
8ff0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
9000: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
9010: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
9020: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
9030: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
9040: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
9050: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
9060: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
9070: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
9080: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
9090: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
90a0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
90b0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
90c0: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
90d0: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
90e0: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
90f0: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
9100: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
9110: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
9120: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
9130: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
9140: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
9150: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
9160: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
9170: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
9180: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
9190: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
91a0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
91b0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
91c0: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
91d0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
91e0: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
91f0: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
9200: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
9210: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
9220: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
9230: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
9240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
9250: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
9260: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
9270: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
9280: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
9290: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
92a0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
92b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
92c0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
92d0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
92e0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
92f0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
9300: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
9310: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
9320: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
9330: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
9340: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
9350: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
9360: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
9370: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
9380: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
9390: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
93a0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
93b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
93c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
93d0: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
93e0: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
93f0: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
9400: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
9410: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9430: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
9440: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
9450: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
9480: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
9490: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
94a0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
94d0: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
94e0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
94f0: 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
9500: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a  >pTmpSpace;   /*
9510: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
9520: 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f  r a page */..  /
9530: 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c  * useCksum shoul
9540: 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68  d be true for th
9550: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
9560: 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a  nd false for.  *
9570: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
9580: 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68  nals.  Verify th
9590: 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  at this is alway
95a0: 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a  s the case.  */.
95b0: 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d    assert( jfd ==
95c0: 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61   (useCksum ? pPa
95d0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
95e0: 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73  r->stfd) );.  as
95f0: 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a  sert( aData );..
9600: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9610: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
9620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9630: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9640: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9650: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
9660: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9670: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9680: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9690: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
96a0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
96b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
96c0: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
96d0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
96e0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
96f0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
9700: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
9710: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
9720: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
9730: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
9740: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
9750: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
9760: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
9770: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
9780: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
9790: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
97a0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
97b0: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
97c0: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
97d0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
97e0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
97f0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
9800: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
9810: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9830: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
9840: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
9850: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
9860: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9880: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
9890: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
98a0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
98b0: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
98c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
98d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
98e0: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
98f0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
9900: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
9910: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
9920: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
9940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
9950: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
9960: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
9970: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9980: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
9990: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
99a0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
99b0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
99c0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
99d0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
99e0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
99f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
9a00: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
9a10: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
9a20: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
9a30: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
9a40: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
9a50: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
9a60: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
9a70: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
9a80: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
9a90: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
9aa0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
9ab0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
9ac0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
9ad0: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
9ae0: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
9af0: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
9b00: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
9b10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
9b20: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
9b30: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
9b40: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
9b50: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
9b60: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
9b70: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9b80: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
9b90: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
9ba0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
9bb0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
9bc0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
9bd0: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
9be0: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
9bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
9c00: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
9c10: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
9c20: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
9c30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
9c40: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
9c50: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
9c60: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
9c70: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
9c80: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
9c90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  in the main roll
9ca0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
9cb0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69  l.  Otherwise, i
9cc0: 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  f a full ROLLBAC
9cd0: 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  K occurs after t
9ce0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  he statement.  *
9cf0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66  * rollback the f
9d00: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c  ull ROLLBACK wil
9d10: 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68  l not restore th
9d20: 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72  e page to its or
9d30: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74  iginal.  ** cont
9d40: 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  ent.  Two condit
9d50: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
9d60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
9d70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9d80: 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20    ** files. (1) 
9d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
9da0: 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32  t be locked.  (2
9db0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
9dc0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
9dd0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
9de0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
9df0: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
9e00: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
9e10: 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68  not in.  ** cach
9e20: 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  e or else it is 
9e30: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
9e40: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
9e50: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
9e60: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
9e70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e80: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9e90: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21  XCLUSIVE || pPg!
9ea0: 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
9eb0: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9ec0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9ed0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9ee0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9ef0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9f00: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9f10: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9f20: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9f30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
9f40: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
9f50: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
9f60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9f70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9f80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9fa0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
9fb0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9fc0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9fd0: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
9fe0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
9ff0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
a000: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
a010: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
a020: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
a030: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
a040: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
a050: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
a060: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
a070: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
a080: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
a090: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
a0a0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a0b0: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
a0c0: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
a0d0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
a0e0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
a0f0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
a100: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
a110: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
a120: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a130: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
a140: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
a150: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
a160: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a170: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
a180: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
a190: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
a1a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a1b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a1c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a1d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a1e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a1f0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a200: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a210: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a220: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a230: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a240: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a250: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a260: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a270: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
a280: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a290: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a2a0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a2b0: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
a2c0: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
a2d0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
a2e0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
a2f0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
a300: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
a310: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
a320: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
a330: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
a340: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
a350: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
a360: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
a370: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
a380: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
a390: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
a3a0: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
a3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a3c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
a3d0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
a3e0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
a3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
a400: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
a410: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
a420: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
a440: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
a450: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
a460: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a470: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
a480: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
a490: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a4a0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
a4b0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
a4c0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
a4e0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
a4f0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
a500: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
a510: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
a520: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a530: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
a540: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
a550: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
a560: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
a570: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
a580: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
a590: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
a5a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
a5b0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
a5c0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a5d0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
a5e0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
a5f0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
a600: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a610: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
a620: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
a630: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
a640: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
a650: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
a660: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
a670: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a680: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
a690: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
a6a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
a6b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a6c0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
a6d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a6e0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
a6f0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
a700: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
a710: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
a720: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
a730: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
a740: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
a750: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
a760: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a770: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
a780: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73   &master);.  ass
a790: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a7a0: 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a  OK || master );.
a7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a7c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a7d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a7e0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a7f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a800: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a810: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a830: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a840: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a850: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a860: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a870: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a880: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a890: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a8a0: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a8b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a8c0: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a8d0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a8e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a8f0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a900: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a920: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a930: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a940: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
a950: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
a960: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a970: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a980: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a990: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a9b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
a9c0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
a9d0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
a9e0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
a9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aa00: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
aa10: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
aa20: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
aa30: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
aa40: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
aa50: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
aa60: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
aa70: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
aa80: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
aa90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
aaa0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
aab0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
aac0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
aad0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
aae0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
aaf0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
ab00: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
ab10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
ab20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
ab30: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
ab40: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
ab50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ab60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ab70: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
ab80: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
ab90: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
aba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
abb0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
abc0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
abd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
abe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
abf0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
ac00: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ac10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac20: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ac30: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ac40: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ac50: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ac60: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
ac70: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ac80: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ac90: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
aca0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
acb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
acc0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
acd0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ace0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
acf0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
ad00: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
ad10: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
ad30: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
ad40: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
ad60: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
ad70: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
ad80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ad90: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
ada0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
adb0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
adc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
add0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
ade0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
adf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
ae00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
ae10: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
ae20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
ae30: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
ae40: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
ae50: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
ae60: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
ae70: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ae90: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
aea0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aeb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
aec0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
aed0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
aee0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
aef0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
af00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
af10: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
af20: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
af30: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
af40: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
af50: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
af60: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
af70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
af80: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
af90: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
afa0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
afb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
afc0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
afd0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
afe0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
aff0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b000: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
b010: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
b020: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
b030: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b040: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b050: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b060: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
b070: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
b080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b090: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
b0a0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b0b0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b0c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b0d0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b0e0: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b0f0: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b100: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b110: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b120: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b130: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b140: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b150: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b160: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b170: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b180: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b190: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b1a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b1b0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b1c0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b1d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b1e0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b1f0: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b200: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b210: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b220: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b240: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b250: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b260: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b270: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b280: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b290: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b2a0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b2b0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b2c0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b2d0: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b2e0: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b2f0: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b300: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b310: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b320: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b330: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b340: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b350: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b360: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b370: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b380: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b390: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b3a0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b3b0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b3c0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b3d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b3e0: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b3f0: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b400: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b410: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b420: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b430: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b440: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b450: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b460: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b470: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b480: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b490: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b4a0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b4b0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b4c0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b4d0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b4e0: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b4f0: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b500: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b510: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b520: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b530: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b540: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b550: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b560: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b570: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b580: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b590: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b5a0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b5b0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b5c0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b5d0: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b5e0: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b5f0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b600: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b610: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b620: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b630: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b640: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b650: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b660: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b670: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b680: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b690: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b6a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b6b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b6c0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b6d0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b6e0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b6f0: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b700: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b710: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b720: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b740: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b750: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b760: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b770: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b780: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b790: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b7a0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b7b0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b7c0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b7d0: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
b7e0: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
b7f0: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
b800: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
b810: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b820: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
b830: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
b840: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b850: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
b860: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
b870: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
b880: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b890: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
b8a0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
b8b0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
b8c0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
b8d0: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
b8e0: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
b8f0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
b900: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
b910: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
b920: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
b930: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
b940: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
b950: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
b960: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
b970: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
b980: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
b990: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
b9a0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
b9b0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
b9c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
b9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
b9e0: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
b9f0: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
ba00: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
ba10: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
ba20: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
ba30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ba40: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
ba50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
ba60: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
ba70: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ba80: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
ba90: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
baa0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bab0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bac0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bad0: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bae0: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
baf0: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bb00: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bb10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bb20: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bb30: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bb40: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bb50: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bb60: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb80: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bb90: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bba0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bbd0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
bbe0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bc10: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
bc20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
bc30: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
bc40: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
bc50: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
bc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc70: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc80: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
bc90: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
bca0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
bcb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
bcc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
bcd0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
bce0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bcf0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
bd00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
bd10: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
bd20: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
bd30: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bd40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bd50: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bd60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd70: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bd80: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bd90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bda0: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bdb0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bdc0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bdd0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
bde0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
bdf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
be00: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
be10: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
be20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
be30: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
be40: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
be50: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
be60: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
be70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
be80: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
be90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
bea0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
beb0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
bec0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
bed0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
bee0: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
bef0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
bf00: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
bf10: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
bf20: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
bf30: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
bf40: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
bf50: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
bf60: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
bf70: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
bf80: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
bf90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bfa0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bfb0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
bfc0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
bfd0: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
bfe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bff0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c000: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c010: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c020: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c030: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c040: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c050: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c060: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c070: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c080: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c090: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c0b0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c0c0: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c0d0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0f0: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c100: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c110: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c120: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c130: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c140: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c150: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c160: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c170: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c180: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c190: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c1a0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c1b0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c1c0: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c1d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c1e0: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c1f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c200: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c210: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c220: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c230: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c240: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c250: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c260: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c270: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c280: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c290: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c2a0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c2b0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c2c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c2d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c2e0: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c2f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c300: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c310: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c320: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c330: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c340: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c350: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c360: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c380: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c390: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c3a0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c3b0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c3c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c3d0: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c3e0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c400: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c410: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c420: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c430: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c440: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c450: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c460: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c470: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c480: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c490: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c4a0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c4b0: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c4c0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c4d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c4e0: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c4f0: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c500: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c520: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c530: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c540: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c550: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c560: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c570: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c580: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c590: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c5a0: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c5b0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c5c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c5d0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c5e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c5f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c600: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c610: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c620: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c630: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c640: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c660: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c670: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c680: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c690: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c6a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c6c0: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c6d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c6e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c6f0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c700: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c710: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c730: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c740: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c750: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c760: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c770: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c780: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c7b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c7c0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c7e0: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
c7f0: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
c800: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
c810: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c820: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c830: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c840: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
c850: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
c860: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
c870: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
c880: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
c890: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
c8a0: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
c8b0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
c8c0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c8d0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c8e0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
c8f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c900: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c910: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
c920: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
c930: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
c940: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
c950: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
c960: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
c970: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
c980: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
c990: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c9a0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c9b0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
c9c0: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
c9d0: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
c9e0: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c9f0: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
ca00: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
ca10: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
ca20: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
ca30: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
ca40: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
ca50: 72 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e  r->fd);.  return
ca60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
ca70: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
ca80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
ca90: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
caa0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
cab0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
cac0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
cad0: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
cae0: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
caf0: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
cb00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
cb10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cb20: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
cb30: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
cb40: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
cb50: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
cb60: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
cb70: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
cb80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
cb90: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
cba0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
cbb0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
cbc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
cbd0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
cbe0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
cbf0: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
cc00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
cc10: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
cc20: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
cc30: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
cc40: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
cc50: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
cc60: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
cc70: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
cc80: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
cc90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cca0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
ccb0: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
ccc0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cce0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
ccf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd10: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cd20: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
cd30: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
cd40: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
cd50: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
cd60: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
cd70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
cd80: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
cd90: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
cda0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cdb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
cdc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
cdd0: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
cde0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
cdf0: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
ce00: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
ce10: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
ce20: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
ce30: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
ce40: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
ce50: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
ce60: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
ce70: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
ce80: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
ce90: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
cea0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
ceb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
cec0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ced0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
cee0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
cef0: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
cf00: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
cf10: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
cf20: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
cf30: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
cf40: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
cf50: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
cf60: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
cf70: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
cf80: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
cf90: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
cfa0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
cfb0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
cfc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
cfd0: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
cfe0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
cff0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
d000: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
d010: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
d020: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d030: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
d040: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
d050: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
d060: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
d070: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
d080: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
d090: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
d0a0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
d0b0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
d0c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
d0d0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
d0e0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
d0f0: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
d100: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d110: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
d120: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
d130: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
d140: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
d150: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
d160: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
d170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
d180: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
d190: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
d1a0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
d1b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d1c0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d1d0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
d1e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
d1f0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d200: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d210: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d220: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
d240: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
d250: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
d260: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
d270: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
d280: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
d290: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
d2a0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
d2b0: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
d2c0: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
d2d0: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
d2e0: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
d2f0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
d300: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
d310: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
d320: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
d330: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
d340: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
d350: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
d360: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
d370: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
d380: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
d390: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
d3a0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
d3b0: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
d3c0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
d3d0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
d3e0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
d3f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
d400: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
d410: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d420: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
d430: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d440: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d450: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
d460: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
d470: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
d480: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
d490: 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65  mtCksum;.  while
d4a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d4b0: 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
d4c0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d4d0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
d4e0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
d4f0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
d500: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d510: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d520: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d530: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d540: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d550: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
d560: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
d570: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
d580: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
d590: 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
d5a0: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
d5b0: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
d5c0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
d5d0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
d5e0: 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
d5f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d600: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
d610: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d620: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
d630: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d640: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
d650: 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
d660: 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
d670: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
d680: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
d690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
d6a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
d6b0: 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
d6c0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
d6d0: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
d6e0: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
d6f0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
d700: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
d710: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
d720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
d730: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d740: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d750: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d760: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d790: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64  ff = szJ;.  .end
d7a0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
d7b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d7c0: 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65  _OK) {.    pPage
d7d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d7e0: 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
d7f0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
d800: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
d810: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d820: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
d830: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
d840: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
d850: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
d860: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
d870: 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
d880: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
d890: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
d8a0: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
d8b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d8c0: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
d8d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d8e0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d8f0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
d900: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
d910: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
d920: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
d930: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
d940: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
d950: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
d960: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
d970: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
d980: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
d990: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
d9a0: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
d9b0: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
d9c0: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
d9d0: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
d9e0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
d9f0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
da00: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
da10: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
da20: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
da30: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
da40: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
da50: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
da60: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
da70: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
da90: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
daa0: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
dab0: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
dac0: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
dad0: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
dae0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
daf0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
db00: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
db10: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
db20: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
db30: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
db40: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
db50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
db60: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
db70: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
db80: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
db90: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
dba0: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
dbb0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
dbc0: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
dbd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
dbe0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
dbf0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
dc00: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
dc10: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
dc20: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
dc30: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
dc40: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
dc50: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
dc60: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
dc70: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
dc80: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
dc90: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
dca0: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
dcb0: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
dcc0: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
dcd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dce0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
dcf0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
dd00: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
dd10: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
dd20: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
dd30: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
dd40: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
dd50: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
dd70: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
dd80: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
dd90: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
dda0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
ddb0: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
ddc0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
ddd0: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
dde0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
ddf0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
de00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
de10: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
de20: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
de30: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
de40: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
de50: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
de60: 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20   full_fsync){.  
de70: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
de80: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
de90: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
dea0: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
deb0: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
dec0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
ded0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
dee0: 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f  ll_fsync = full_
def0: 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61  fsync;.  if( pPa
df00: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
df10: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
df20: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
df30: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
df40: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
df50: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
df60: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
df70: 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
df80: 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
df90: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
dfa0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
dfb0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
dfc0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
dfd0: 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
dfe0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
dff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
e000: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
e010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
e020: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e030: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
e040: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
e050: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
e060: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e070: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
e080: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
e090: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
e0a0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
e0b0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
e0c0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
e0d0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
e0e0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
e0f0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
e100: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
e110: 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a  pentemp(OsFile *
e120: 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74  *pFd){.  int cnt
e130: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
e140: 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c    char zFile[SQL
e150: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
e160: 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  E];..#ifdef SQLI
e170: 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
e180: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
e190: 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
e1a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
e1b0: 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
e1c0: 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63  ndif.  do{.    c
e1d0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
e1e0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
e1f0: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
e200: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
e210: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70  clusive(zFile, p
e220: 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Fd, 1);.    asse
e230: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
e240: 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d  K || *pFd );.  }
e250: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
e260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
e270: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
e280: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
e290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e2a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
e2b0: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
e2c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
e2d0: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
e2e0: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
e2f0: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
e300: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
e310: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
e320: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
e330: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
e340: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
e350: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
e360: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
e370: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
e380: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
e390: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
e3a0: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
e3b0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
e3c0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
e3d0: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
e3e0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
e3f0: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
e400: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
e410: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
e420: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
e430: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
e440: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
e450: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
e460: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
e470: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
e480: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
e490: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
e4a0: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
e4b0: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
e4c0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
e4d0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
e4e0: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
e4f0: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
e500: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
e510: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
e520: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
e530: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
e540: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
e550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e560: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
e570: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
e580: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
e590: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e5b0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
e5c0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
e5d0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
e5e0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
e5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
e600: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
e610: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
e620: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
e630: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  0;.  char *zFull
e640: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
e650: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a  int nameLen;  /*
e660: 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f   Compiler is wro
e670: 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  ng. This is alwa
e680: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ys initialized b
e690: 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f  efore use */.  O
e6a0: 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20  sFile *fd = 0;. 
e6b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e6c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
e6d0: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
e6e0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
e6f0: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
e700: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
e710: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
e720: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
e730: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
e740: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
e750: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
e760: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
e770: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
e780: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
e790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e7a0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
e7b0: 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
e7c0: 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
e7d0: 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
e7e0: 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
e7f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
e800: 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
e810: 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
e820: 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
e830: 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
e840: 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
e850: 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
e860: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
e870: 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
e880: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
e890: 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
e8a0: 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
e8b0: 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
e8c0: 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20  e set. It would 
e8d0: 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72  be nice to asser
e8e0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65  t.  ** that Thre
e8f0: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73  adData.nAlloc is
e900: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61   non-zero, but a
e910: 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20  las this breaks 
e920: 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a  test cases .  **
e930: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f   written to invo
e940: 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72  ke the pager dir
e950: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68  ectly..  */.  Th
e960: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
e970: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e980: 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
e990: 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  pTsd );.#endif..
e9a0: 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20    /* We used to 
e9b0: 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29  test if malloc()
e9c0: 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69   had already fai
e9d0: 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65  led before proce
e9e0: 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74  eding. .  ** But
e9f0: 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75   the way this fu
ea00: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  nction is used i
ea10: 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74  n SQLite means t
ea20: 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20  hat can never.  
ea30: 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68  ** happen. Furth
ea40: 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d  ermore, if the m
ea50: 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
ea60: 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  g is already set
ea70: 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74  , .  ** either t
ea80: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
ea90: 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c  eStrDup() or sql
eaa0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f  iteMalloc() belo
eab0: 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c  w will.  ** fail
eac0: 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c   shortly and SQL
ead0: 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e  ITE_NOMEM return
eae0: 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a  ed anyway..  */.
eaf0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
eb00: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
eb10: 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
eb20: 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
eb30: 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
eb40: 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
eb50: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
eb60: 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
eb70: 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
eb80: 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
eb90: 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
eba0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
ebb0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
ebc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ebd0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
ebe0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
ebf0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
ec00: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
ec10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
ec20: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ec30: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
ec40: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ec50: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
ec60: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
ec70: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
ec80: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
ec90: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
eca0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
ecb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
ecc0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
ecd0: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
ece0: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
ecf0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ed00: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20  SQLITE_OK || fd 
ed10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ed20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
ed30: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
ed40: 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20  pentemp(&fd);.  
ed50: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ed60: 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a  ileName(zTemp);.
ed70: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
ed80: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
ed90: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
eda0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
edb0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
edc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
edd0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
ede0: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
edf0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
ee00: 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  te the Pager str
ee10: 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20  ucture. As part 
ee20: 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f  of the same allo
ee30: 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65  cation, allocate
ee40: 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  .  ** space for 
ee50: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f  the full paths o
ee60: 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65  f the file, dire
ee70: 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61  ctory and journa
ee80: 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a  l .  ** (Pager.z
ee90: 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e  Filename, Pager.
eea0: 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50  zDirectory and P
eeb0: 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a  ager.zJournal)..
eec0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
eed0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
eee0: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
eef0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ef00: 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
ef10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
ef20: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
ef30: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
ef40: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26      if( pPager &
ef50: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
ef60: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ef70: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68  >pTmpSpace = (ch
ef80: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
ef90: 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41  cRaw(SQLITE_DEFA
efa0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
efb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
efc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
efd0: 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  ured in either o
efe0: 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
eff0: 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d  ve, free the mem
f000: 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ory .  ** pointe
f010: 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74  d to by zFullPat
f020: 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20  hname, free the 
f030: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
f040: 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20  and close the . 
f050: 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20   ** file. Since 
f060: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
f070: 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
f080: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
f090: 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
f0a0: 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
f0b0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
f0c0: 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75   !pPager || !zFu
f0d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70  llPathname || !p
f0e0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
f0f0: 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
f100: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
f110: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
f120: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
f130: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f140: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
f150: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
f160: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
f170: 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
f180: 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
f190: 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
f1a0: 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
f1b0: 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
f1c0: 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43  hname);.  IOTRAC
f1d0: 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
f1e0: 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c  ", pPager, zFull
f1f0: 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61  Pathname)).  pPa
f200: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
f210: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
f220: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
f230: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
f240: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
f250: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
f260: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
f270: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f280: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
f290: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
f2a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
f2b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
f2c0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
f2d0: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
f2e0: 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69  hname);..  for(i
f2f0: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
f300: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f310: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
f320: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
f330: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
f340: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
f350: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
f360: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
f370: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
f380: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
f390: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
f3a0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
f3b0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
f3c0: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
f3d0: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
f3e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3f0: 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
f400: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
f410: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
f420: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
f430: 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
f440: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
f450: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
f460: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
f470: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f480: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
f490: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f4a0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
f4b0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f4c0: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
f4d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
f4e0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
f4f0: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
f500: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
f510: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f520: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
f530: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f540: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
f550: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f560: 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f  nMaxPage = 0; */
f570: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
f580: 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72  e = 100;.  asser
f590: 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d  t( PAGER_UNLOCK=
f5a0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  =0 );.  /* pPage
f5b0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
f5c0: 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
f5d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
f5e0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f5f0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
f600: 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
f610: 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
f620: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
f630: 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
f640: 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
f650: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
f660: 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
f670: 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
f680: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
f690: 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
f6a0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
f6b0: 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
f6c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
f6d0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f6e0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
f6f0: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f700: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
f710: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
f720: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
f730: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
f740: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
f750: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
f760: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
f770: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
f780: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
f790: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
f7a0: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
f7b0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f7c0: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f7d0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f7e0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f7f0: 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
f800: 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  fd||memDb);.  if
f810: 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
f820: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f830: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
f840: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
f850: 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
f860: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
f870: 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
f880: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
f890: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
f8a0: 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
f8b0: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
f8c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f8d0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
f8e0: 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
f8f0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d  r->pNext = pTsd-
f900: 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d  >pPager;.  pTsd-
f910: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
f920: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
f930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f940: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
f950: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
f960: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f970: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f980: 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
f990: 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
f9a0: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
f9b0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
f9c0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
f9d0: 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
f9e0: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
f9f0: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
fa00: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
fa10: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
fa20: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
fa30: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
fa40: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
fa50: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
fa60: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
fa70: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
fa80: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
fa90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
faa0: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
fab0: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
fac0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
fad0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
fae0: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
faf0: 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
fb00: 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
fb10: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
fb20: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
fb30: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
fb40: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
fb50: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
fb60: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
fb70: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
fb80: 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
fb90: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
fba0: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
fbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fbc0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
fbd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fbe0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
fbf0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
fc00: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
fc10: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
fc20: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
fc30: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
fc40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
fc50: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
fc60: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
fc70: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
fc80: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
fc90: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
fca0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
fcb0: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
fcc0: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
fcd0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
fce0: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
fcf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fd00: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
fd10: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
fd20: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
fd30: 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
fd40: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
fd50: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
fd60: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
fd70: 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20  e size.  Return 
fd80: 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49  the new size.  I
fd90: 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
fda0: 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69  w page.** size i
fdb0: 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  s inappropriate,
fdc0: 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
fdd0: 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
fde0: 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e  s selected.** an
fdf0: 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  d returned..*/.i
fe00: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
fe10: 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
fe20: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
fe30: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
fe40: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
fe50: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
fe60: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
fe70: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
fe80: 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
fe90: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
fea0: 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
feb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
fec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
fed0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
fee0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
fef0: 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   = sqlite3Reallo
ff00: 63 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d 3e  cOrFree(pPager->
ff10: 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53  pTmpSpace, pageS
ff20: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ize);.  }.  retu
ff30: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
ff40: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
ff50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
ff60: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
ff70: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
ff80: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
ff90: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
ffa0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
ffb0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
ffc0: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
ffd0: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
ffe0: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
fff0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
10000 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
10010 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
10020 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
10030 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
10040 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
10050 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
10060 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
10070 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
10080 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
10090 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
100a0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
100b0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
100c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
100d0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
100e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
100f0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
10100 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
10110 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
10120 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
10130 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10140 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
10150 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
10160 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
10170 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
10180 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
10190 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
101a0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
101b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
101c0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
101d0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
101e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
101f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
10200 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
10210 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10220 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10230 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10240 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
10250 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
10260 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
10270 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
10280 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
10290 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
102a0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
102b0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
102c0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
102d0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
102e0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
102f0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
10300 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
10310 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10320 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10330 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10340 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
10350 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
10360 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
10370 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
10380 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
10390 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
103a0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
103b0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
103c0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
103d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
103e0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
103f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10400 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
10410 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10420 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10430 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10440 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
10450 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
10460 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
10470 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
10490 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
104a0 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
104b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
104c0 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
104d0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
104e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
104f0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
10500 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
10510 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10530 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10540 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10560 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10580 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10590 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
105a0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
105b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
105c0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
105d0 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
105e0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
105f0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
10600 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
10610 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10620 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10630 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10640 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10650 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10660 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10670 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10680 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10690 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
106a0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
106b0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
106c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
106d0 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
106e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
106f0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10700 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10710 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10720 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10730 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10740 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10750 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10760 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10770 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10790 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
107a0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
107b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
107c0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
107d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
107e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
107f0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10800 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10810 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10820 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10830 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10850 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10860 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10880 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10890 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
108a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
108b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
108c0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
108d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
108e0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
108f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10910 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10920 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10930 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10940 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10950 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10960 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10970 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10980 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10990 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
109a0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
109b0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
109c0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
109d0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
109e0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
109f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10a00 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10a10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10a20 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10a30 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10a40 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10a50 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10a60 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10a70 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10a80 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10a90 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10aa0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10ab0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10ac0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10ad0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
10ae0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
10af0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
10b00 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
10b10 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
10b20 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
10b30 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
10b40 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
10b50 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10b60 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
10b70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
10b80 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10b90 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
10ba0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
10bb0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
10bc0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
10bd0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
10be0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10bf0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
10c00 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
10c10 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
10c20 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
10c30 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10c40 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
10c50 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10c60 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
10c70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
10c80 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
10c90 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
10ca0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
10cb0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
10cc0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
10cd0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
10ce0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
10cf0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10d00 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
10d10 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
10d20 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
10d30 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
10d40 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
10d50 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
10d60 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
10d70 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
10d80 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
10d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
10da0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10db0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
10dc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
10dd0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
10de0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
10df0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
10e00 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10e10 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
10e20 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
10e30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
10e40 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
10e50 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
10e60 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
10e70 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
10e80 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
10e90 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
10ea0 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
10eb0 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
10ec0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10ed0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10ee0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
10ef0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
10f00 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
10f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
10f20 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
10f30 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
10f40 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
10f50 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
10f60 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
10f70 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
10f80 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10f90 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10fa0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
10fb0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
10fc0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10fd0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
10fe0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10ff0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
11000 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
11010 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11020 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11030 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11040 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11050 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
11060 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
11070 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11080 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
11090 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
110a0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
110b0 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
110c0 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
110d0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
110e0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
110f0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
11100 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11110 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
11120 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
11130 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
11140 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64  .** is truncated
11150 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65  .  Drop from the
11160 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73   cache all pages
11170 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a   whose pgno is.*
11180 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  * larger than pP
11190 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
111a0 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
111b0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
111c0 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
111d0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
111e0 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
111f0 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  **.** Actually, 
11200 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69  at the point thi
11210 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11220 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65  led, it would be
11230 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
11240 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  have a reference
11250 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74  d page.  But rat
11260 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a  her than delete.
11270 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64  ** that page and
11280 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62   guarantee a sub
11290 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74  sequent segfault
112a0 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65  , it seems bette
112b0 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20  r.** to zero it 
112c0 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65  and hope that we
112d0 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c   error out sanel
112e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
112f0 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
11300 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
11310 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11320 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11330 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11340 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
11350 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
11360 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
11370 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
11380 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
11390 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
113a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
113b0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
113c0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
113d0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
113e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
113f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
11400 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
11410 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11420 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11430 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11440 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
11450 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11460 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46     IOTRACE(("PGF
11470 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  REE %p %d\n", pP
11480 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
11490 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
114a0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
114b0 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
114c0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
114d0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61  e(pPg);.      ma
114e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
114f0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11500 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
11510 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
11520 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
11530 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
11540 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
11550 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
11560 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
11570 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
11580 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
11590 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
115a0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
115b0 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
115c0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
115d0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
115e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
115f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
11600 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
11610 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
11620 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
11630 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
11640 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
11650 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
11660 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
11670 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pe){.  int rc;..
11680 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
11690 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
116a0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
116b0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
116c0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
116d0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
116e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
116f0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
11700 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
11710 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
11720 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
11730 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
11740 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
11750 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
11760 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
11770 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
11780 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
11790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
117a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
117b0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
117c0 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20  Size<0 || MEMDB 
117d0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
117e0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
117f0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
11800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
11810 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
11820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
11830 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
11840 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
11850 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11860 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65  E_BUSY && sqlite
11870 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
11880 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
11890 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20  Handler) );.    
118a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
118b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
118c0 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
118d0 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
118e0 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
118f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
11900 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
11910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11920 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
11930 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
11940 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
11950 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
11960 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
11970 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11980 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
11990 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
119a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
119b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
119c0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20  ED || MEMDB );. 
119d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
119e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
119f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
11a00 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
11a10 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
11a20 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  e;.    return rc
11a30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
11a40 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
11a50 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
11a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11a70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  _OK;.  }.  if( M
11a80 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
11a90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
11aa0 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
11ab0 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
11ac0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
11ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11ae0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
11af0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
11b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11b10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11b20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
11b30 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11b40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
11b50 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
11b60 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
11b70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
11b80 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
11b90 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
11ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11bb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11bc0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
11bd0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
11be0 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65  er, nPage);.  re
11bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c00 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
11c10 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
11c20 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
11c30 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
11c40 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
11c50 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
11c60 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
11c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11c80 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
11c90 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
11ca0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
11cb0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
11cc0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
11cd0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
11ce0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
11cf0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
11d00 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
11d10 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
11d20 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
11d30 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
11d40 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
11d50 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
11d60 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
11d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11d80 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
11d90 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
11da0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
11db0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
11dc0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
11dd0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
11de0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11df0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
11e00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
11e10 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
11e20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
11e30 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
11e40 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
11e50 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
11e60 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
11e70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
11e80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11e90 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
11ea0 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
11eb0 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
11ec0 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
11ed0 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
11ee0 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
11ef0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
11f00 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
11f10 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
11f20 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
11f30 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
11f40 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
11f50 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
11f60 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
11f70 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
11f80 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
11f90 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
11fa0 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
11fb0 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  et..  */.  Threa
11fc0 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
11fd0 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
11fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11ff0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
12000 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e   pTsd && pTsd->n
12010 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a  Alloc );.#endif.
12020 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
12030 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12040 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
12050 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
12060 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
12070 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
12080 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
12090 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
120a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
120b0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
120c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
120d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
120e0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
120f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
12100 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
12110 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
12120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12130 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
12140 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12150 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
12160 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
12170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
12180 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
12190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
121a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
121b0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
121c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
121d0 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
121e0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
121f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12200 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
12210 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
12220 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
12230 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
12240 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
12250 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
12260 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
12270 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12280 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
12290 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
122a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
122b0 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66    ** }.  */..#if
122c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
122d0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
122e0 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
122f0 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74  the pager from t
12300 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
12310 66 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e  f pagers startin
12320 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61  g at .  ** Threa
12330 64 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20  dData.pPager if 
12340 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
12350 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  t is enabled..  
12360 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  */.  if( pPager=
12370 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b  =pTsd->pPager ){
12380 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65  .    pTsd->pPage
12390 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  r = pPager->pNex
123a0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
123b0 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20  Pager *pTmp;.   
123c0 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64   for(pTmp = pTsd
123d0 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e  ->pPager; pTmp->
123e0 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70  pNext!=pPager; p
123f0 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29  Tmp=pTmp->pNext)
12400 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65  {}.    pTmp->pNe
12410 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
12420 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  xt;.  }.#endif. 
12430 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12440 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
12450 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
12460 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
12470 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
12480 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12490 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
124a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
124b0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
124c0 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
124d0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
124e0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
124f0 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
12500 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
12510 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
12520 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
12530 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
12540 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12550 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
12560 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
12570 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
12580 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
12590 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
125a0 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
125b0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
125c0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
125d0 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
125e0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
125f0 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
12600 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
12610 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
12620 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12630 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
12640 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
12650 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
12660 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
12670 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
12680 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
12690 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
126a0 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
126b0 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
126c0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
126d0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
126e0 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
126f0 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
12700 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
12710 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
12720 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
12730 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
12740 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
12750 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12760 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
12770 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
12780 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
12790 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
127a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
127b0 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
127c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
127d0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
127e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
127f0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
12800 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
12810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
12820 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12830 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12840 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
12850 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
12860 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
12870 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
12880 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
12890 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
128a0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
128b0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
128c0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
128d0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
128e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
128f0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
12900 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
12910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
12920 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
12930 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
12940 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
12950 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
12960 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
12970 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
12980 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
12990 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
129a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
129b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
129c0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
129d0 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
129e0 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
129f0 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
12a00 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
12a10 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
12a20 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
12a30 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
12a40 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
12a50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
12a60 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
12a70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
12a80 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
12a90 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
12aa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12ab0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
12ac0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
12ad0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12ae0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
12af0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
12b00 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
12b10 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
12b20 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
12b30 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
12b40 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
12b50 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
12b60 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
12b70 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12b80 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
12b90 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
12ba0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
12bb0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
12bc0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
12bd0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
12be0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
12bf0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
12c00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
12c10 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
12c20 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
12c30 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
12c40 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
12c50 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
12c60 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
12c70 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12c80 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
12c90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
12ca0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
12cb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
12cc0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
12cd0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
12ce0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
12cf0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
12d00 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
12d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
12d20 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
12d30 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12d40 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
12d50 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
12d60 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
12d70 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
12d80 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
12d90 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
12da0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
12db0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
12dc0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
12dd0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
12de0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
12df0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
12e00 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
12e10 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
12e20 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
12e30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
12e40 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
12e50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12e60 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
12e70 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
12e80 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
12e90 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
12ea0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
12eb0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
12ec0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12ed0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
12ee0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12ef0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
12f00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
12f10 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
12f20 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
12f30 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
12f40 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
12f50 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
12f60 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
12f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
12f80 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
12f90 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12fa0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
12fb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12fc0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
12fd0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
12fe0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
12ff0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
13000 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
13010 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
13020 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
13030 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
13040 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
13050 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
13060 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13070 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
13080 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
13090 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
130a0 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
130b0 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
130c0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
130d0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
130e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
130f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13100 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13110 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
13120 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13140 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
13150 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13160 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
13170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13180 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13190 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
131a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
131b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
131c0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
131d0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
131e0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
131f0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
13200 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
13210 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
13220 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
13230 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
13240 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
13250 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
13260 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
13270 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
13280 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
13290 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
132a0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
132b0 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
132c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
132d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
132f0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
13300 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
13310 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
13330 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
13340 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
13350 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13360 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
13370 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13380 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
133a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
133c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  (pPager->jfd,.  
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
133f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
13400 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
13410 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ic));.        if
13420 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13430 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
13440 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
13450 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a   %d\n", pPager,.
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13480 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
13490 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29  ournalMagic), 4)
134a0 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ).        rc = w
134b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
134c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
134d0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
134e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
134f0 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
13500 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
13510 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
13520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
13530 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13540 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13550 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
13560 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
13570 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
13580 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
13590 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
135a0 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50  "JSYNC %d\n", pP
135b0 61 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20  ager)).      rc 
135c0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
135d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
135e0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
135f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13600 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
13610 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13620 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
13630 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
13640 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
13650 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
13660 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
13670 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
13680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13690 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
136a0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
136b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
136c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
136d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
136e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
136f0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
13700 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
13710 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
13720 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
13730 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
13740 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
13750 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
13760 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
13770 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
13780 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
13790 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
137a0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
137b0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
137c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
137d0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
137e0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
137f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13800 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
13810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
13820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
13830 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
13840 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
13850 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
13860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
13870 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f  erge two lists o
13880 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  f pages connecte
13890 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20  d by pDirty and 
138a0 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a  in pgno order..*
138b0 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69  * Do not both fi
138c0 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69  xing the pPrevDi
138d0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  rty pointers..*/
138e0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d  .static PgHdr *m
138f0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67  erge_pagelist(Pg
13900 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a  Hdr *pA, PgHdr *
13910 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73  pB){.  PgHdr res
13920 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70  ult, *pTail;.  p
13930 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a  Tail = &result;.
13940 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
13950 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
13960 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29  >pgno<pB->pgno )
13970 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
13980 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20  Dirty = pA;.    
13990 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20    pTail = pA;.  
139a0 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69      pA = pA->pDi
139b0 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
139c0 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
139d0 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rty = pB;.      
139e0 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20  pTail = pB;.    
139f0 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74    pB = pB->pDirt
13a00 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  y;.    }.  }.  i
13a10 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61  f( pA ){.    pTa
13a20 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
13a30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20  .  }else if( pB 
13a40 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
13a50 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c  irty = pB;.  }el
13a60 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70  se{.    pTail->p
13a70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Dirty = 0;.  }. 
13a80 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70   return result.p
13a90 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
13aa0 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66  Sort the list of
13ab0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
13ac0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e  ing order by pgn
13ad0 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a  o.  Pages are.**
13ae0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
13af0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20  irty pointers.  
13b00 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  The pPrevDirty p
13b10 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63  ointers are.** c
13b20 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73  orrupted by this
13b30 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   sort..*/.#defin
13b40 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  e N_SORT_BUCKET_
13b50 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65  ALLOC 25.#define
13b60 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20   N_SORT_BUCKET  
13b70 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53       25.#ifdef S
13b80 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
13b90 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
13ba0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30  _sort_bucket = 0
13bb0 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52  ;.  #undef N_SOR
13bc0 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69  T_BUCKET.  #defi
13bd0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
13be0 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70   \.   (sqlite3_p
13bf0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13c00 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72  et?sqlite3_pager
13c10 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e  _n_sort_bucket:N
13c20 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
13c30 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  OC).#endif.stati
13c40 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
13c50 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
13c60 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
13c70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
13c80 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69  OC], *p;.  int i
13c90 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c  ;.  memset(a, 0,
13ca0 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77   sizeof(a));.  w
13cb0 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20  hile( pIn ){.   
13cc0 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49   p = pIn;.    pI
13cd0 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  n = p->pDirty;. 
13ce0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
13cf0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13d00 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  <N_SORT_BUCKET-1
13d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
13d20 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( a[i]==0 ){.   
13d30 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20       a[i] = p;. 
13d40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d60 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
13d70 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
13d80 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30          a[i] = 0
13d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13da0 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52      if( i==N_SOR
13db0 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20  T_BUCKET-1 ){.  
13dc0 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
13dd0 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68   To get here, th
13de0 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32  ere need to be 2
13df0 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29  ^(N_SORT_BUCKET)
13e00 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65   .      ** eleme
13e10 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
13e20 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70   list. This is p
13e30 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70  ossible, but imp
13e40 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20  ractical..      
13e50 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20  ** Testing this 
13e60 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e  line is the poin
13e70 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69  t of global vari
13e80 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71  able.      ** sq
13e90 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
13ea0 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20  rt_bucket..     
13eb0 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   */.      a[i] =
13ec0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13ed0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
13ee0 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
13ef0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
13f00 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
13f10 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
13f20 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
13f30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13f40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
13f50 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
13f60 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
13f70 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
13f80 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
13f90 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
13fa0 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
13fb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13fc0 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
13fd0 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
13fe0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
13ff0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
14000 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
14010 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
14020 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
14030 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
14040 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14050 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
14060 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
14070 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14080 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
14090 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
140a0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
140b0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
140c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
140d0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
140e0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
140f0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
14100 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
14110 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
14120 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
14130 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
14140 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
14150 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
14160 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
14170 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
14180 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
14190 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
141a0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
141b0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
141c0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
141d0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
141e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
141f0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
14200 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
14210 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
14220 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
14230 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
14240 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
14250 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
14260 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
14270 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
14280 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
14290 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
142a0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
142b0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
142c0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
142d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
142e0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
142f0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
14300 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
14310 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
14320 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
14330 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
14340 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14350 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
14360 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
14370 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
14380 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
14390 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
143a0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
143b0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
143c0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
143d0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
143e0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
143f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14400 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14410 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
14420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14440 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
14450 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
14460 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
14470 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14480 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
14490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
144a0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
144b0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
144c0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
144d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
144e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
144f0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
14500 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14510 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
14520 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
14530 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
14540 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
14550 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
14560 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
14570 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
14580 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
14590 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
145a0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
145b0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
145c0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
145d0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
145e0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
145f0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14600 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14610 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
14620 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
14630 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
14640 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
14650 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
14660 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
14670 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
14680 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
14690 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
146a0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
146b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
146c0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
146d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
146e0 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
146f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14700 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
14710 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
14720 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14730 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
14740 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
14750 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
14760 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
14770 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
14780 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
14790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
147a0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
147b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
147c0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
147d0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
147e0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
147f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
14800 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
14810 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14820 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
14830 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
14840 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
14850 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
14860 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
14870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14880 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
14890 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
148a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
148b0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
148c0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
148d0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
148e0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
148f0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
14900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
14920 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
14930 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
14940 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
14950 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14960 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
14970 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
14980 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
14990 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
149a0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
149b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
149c0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
149d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
149e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
149f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
14a00 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
14a10 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14a20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
14a30 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
14a40 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
14a50 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
14a60 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
14a70 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
14a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
14a90 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14ab0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
14ac0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
14ad0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
14ae0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
14af0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
14b00 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
14b10 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
14b20 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
14b30 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
14b40 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
14b50 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
14b60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14b70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
14b80 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
14b90 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14ba0 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
14bb0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
14bc0 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
14bd0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
14be0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
14bf0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
14c00 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  >fd) ){.    retu
14c10 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
14c20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14c30 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
14c40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14c50 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14c60 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
14c70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14c90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14ca0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
14cb0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
14cc0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
14cd0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
14ce0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
14cf0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
14d00 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
14d10 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
14d20 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
14d30 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
14d40 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
14d50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14d60 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
14d70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
14d80 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14d90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14da0 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
14db0 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a  assert(!MEMDB);.
14dc0 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
14dd0 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
14de0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
14df0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
14e00 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
14e10 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
14e20 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
14e30 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
14e40 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14e50 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nced;..  /* If w
14e60 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
14e70 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
14e80 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
14e90 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e   fsync().  ** on
14ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14eb0 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
14ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
14ed0 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76  This is a.  ** v
14ee0 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
14ef0 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
14f00 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
14f10 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
14f20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
14f30 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20   helped..  */.  
14f40 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50  if( pPg==0 && pP
14f50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20  ager->pFirst && 
14f60 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42  syncOk && !MEMDB
14f70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
14f80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
14f90 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
14fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
14fb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
14fd0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  lSync ){.      /
14fe0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
14ff0 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
15000 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
15010 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  er into the.    
15020 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
15030 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
15040 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
15050 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
15060 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65  l.      ** heade
15070 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
15080 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
15090 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
150a0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61   have.      ** a
150b0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
150c0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
150d0 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65  ase (in case the
150e0 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20   header is.     
150f0 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
15100 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
15110 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
15120 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
15130 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
15160 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
15170 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
15180 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
15190 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
151a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
151b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
151c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
151d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
151e0 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50    }.    pPg = pP
151f0 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
15200 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
15210 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15220 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
15230 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
15240 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
15250 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
15260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15270 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
15280 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
15290 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e  >dirty ){.    in
152a0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
152b0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
152c0 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  =0 );.    makeCl
152d0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
152e0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
152f0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
15300 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
15310 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
15320 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
15330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15340 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
15350 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
15360 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
15370 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
15380 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
15390 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
153a0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
153b0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
153c0 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
153d0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
153e0 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
153f0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
15400 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
15410 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
15420 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
15430 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
15440 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
15450 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
15460 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
15470 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
15480 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
15490 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
154a0 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
154b0 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
154c0 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
154d0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
154e0 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
154f0 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15500 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
15510 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
15520 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
15530 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
15540 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
15550 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
15560 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
15570 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
15580 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
15590 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
155a0 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
155b0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
155c0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
155d0 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
155e0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
155f0 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
15600 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
15610 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
15620 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
15630 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70  pgno==0 );..  *p
15640 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
15650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15670 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15680 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
15690 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
156a0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
156b0 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
156c0 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
156d0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
156e0 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
156f0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
15700 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15710 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
15720 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
15730 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
15740 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
15750 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
15760 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
15770 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
15780 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
15790 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
157a0 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
157b0 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
157c0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
157d0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
157e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
157f0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
15800 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
15810 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
15820 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
15830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
15840 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
15850 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15860 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
15870 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20   nReq){.  const 
15880 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
15890 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
158a0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
158b0 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  ;.  int nRelease
158c0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  d = 0;.  int i;.
158d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65  .  /* If the the
158e0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
158f0 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72   held, this subr
15900 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61  outine becomes a
15910 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f  .  ** o-op; zero
15920 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15930 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69   are freed.  Thi
15940 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a  s is because.  *
15950 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f  * some of the co
15960 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  de invoked by th
15970 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
15980 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f  also.  ** try to
15990 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65   obtain the mute
159a0 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  x, resulting in 
159b0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f  a deadlock..  */
159c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
159d0 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20  InMutex(0) ){.  
159e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
159f0 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20  .  /* Outermost 
15a00 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74  loop runs for at
15a10 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74   most two iterat
15a20 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72  ions. First iter
15a30 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72  ation we.  ** tr
15a40 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79  y to find memory
15a50 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c   that can be rel
15a60 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63 61  eased without ca
15a70 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53  lling fsync(). S
15a80 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61  econd.  ** itera
15a90 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79  tion (which only
15aa0 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69 72   runs if the fir
15ab0 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65  st failed to fre
15ac0 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a  e nReq bytes of.
15ad0 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20    ** memory) is 
15ae0 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c  permitted to cal
15af0 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20  l fsync(). This 
15b00 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63  is of course muc
15b10 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70  h more .  ** exp
15b20 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66  ensive..  */.  f
15b30 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b  or(i=0; i<=1; i+
15b40 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70  +){..    /* Loop
15b50 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
15b60 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f   SQLite pagers o
15b70 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  pened by the cur
15b80 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a  rent thread. */.
15b90 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
15ba0 72 20 3d 20 70 54 73 64 72 6f 2d 3e 70 50 61 67  r = pTsdro->pPag
15bb0 65 72 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 70  er;.    for( ; p
15bc0 50 61 67 65 72 20 26 26 20 28 6e 52 65 71 3c 30  Pager && (nReq<0
15bd0 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
15be0 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50 61 67  eq); pPager=pPag
15bf0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
15c00 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
15c10 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
15c20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
15c30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15c40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15c50 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67   /* For each pag
15c60 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20  er, try to free 
15c70 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73  as many pages as
15c80 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f   possible (witho
15c90 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ut .      ** cal
15ca0 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20  ling fsync() if 
15cb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15cc0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
15cd0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20  he outermost .  
15ce0 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20      ** loop)..  
15cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69      */.      whi
15d00 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  le( SQLITE_OK==(
15d10 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
15d20 6c 65 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  le(pPager, i, &p
15d30 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
15d40 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
15d50 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
15d60 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
15d70 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
15d80 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
15d90 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15da0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15db0 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
15dc0 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
15dd0 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
15de0 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
15df0 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
15e00 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
15e10 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
15e20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
15e30 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
15e40 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
15e50 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
15e60 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
15e70 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15e80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15e90 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15ea0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15eb0 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
15ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
15ed0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
15ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
15ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15f00 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
15f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
15f20 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
15f30 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
15f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15f50 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
15f60 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
15f70 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
15f80 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
15f90 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
15fa0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
15fb0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
15fc0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
15fd0 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
15fe0 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
15ff0 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
16000 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
16010 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
16020 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
16030 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
16040 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
16050 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
16060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16070 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
16080 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
16090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
160a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
160b0 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
160c0 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
160d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
160e0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  r .        ** jo
160f0 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
16100 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
16110 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
16120 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
16130 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
16140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16150 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
16160 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
16170 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
16180 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
16190 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
161a0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
161b0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
161c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
161d0 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
161e0 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
161f0 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
16200 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
16210 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16220 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26      assert( (rc&
16230 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
16240 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
16250 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
16260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16270 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
16280 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
16290 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
162a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
162b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
162c0 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65   return nRelease
162d0 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
162e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
162f0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a  ORY_MANAGEMENT *
16300 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
16310 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
16320 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
16330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
16350 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
16360 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
16370 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
16380 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16390 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
163a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
163b0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
163c0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
163d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
163e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
163f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
16400 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16410 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
16420 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16450 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
16460 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
16470 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
16480 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
16490 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
164a0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
164b0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
164c0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
164d0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  );.  PAGERTRACE3
164e0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
164f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16500 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
16510 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  o);.  if( pgno==
16520 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
16530 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
16540 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
16550 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
16560 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
165a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
165b0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
165c0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
165d0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
165e0 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75 72 6e  no, 3);.  return
165f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16610 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16620 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16630 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16640 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
16650 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16660 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16670 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16680 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16690 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
166a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
166b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
166c0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
166d0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
166e0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
166f0 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
16700 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16710 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16720 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16730 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16740 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
16750 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
16760 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
16770 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
16780 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
16790 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
167a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
167b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
167c0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
167d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
167e0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
167f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
16800 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
16810 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16820 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
16830 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16840 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16850 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
16860 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16880 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16890 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
168a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
168b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
168c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
168d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
168e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
168f0 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
16900 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
16910 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
16920 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16930 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16940 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16950 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16960 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16970 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16980 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
16990 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
169a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
169b0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
169c0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
169d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
169e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
169f0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
16a00 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16a10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16a20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16a30 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16a40 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
16a50 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
16a60 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
16a70 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
16a80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16aa0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16ab0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16ac0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16ad0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16ae0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
16af0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
16b00 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16b10 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16b20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
16b30 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
16b40 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
16b50 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
16b60 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16b70 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
16b80 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
16b90 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
16ba0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
16bb0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
16bc0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
16bd0 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
16be0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
16bf0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16c00 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
16c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
16c20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16c30 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16c40 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16c50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16c70 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
16c80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16c90 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
16ca0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16cb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16cd0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
16ce0 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
16cf0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
16d00 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
16d10 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
16d20 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
16d30 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
16d40 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
16d50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
16d60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16d70 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
16d80 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
16d90 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
16da0 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
16db0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
16dc0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
16dd0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
16de0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
16df0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
16e00 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
16e10 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
16e20 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
16e30 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
16e40 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
16e50 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
16e60 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
16e70 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
16e80 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
16e90 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
16ea0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
16eb0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
16ec0 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
16ed0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
16ee0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16ef0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
16f00 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
16f10 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
16f20 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
16f30 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
16f40 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
16f50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
16f60 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
16f70 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
16f80 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
16f90 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
16fa0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
16fb0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
16fc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16fe0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
16ff0 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
17000 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
17010 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
17020 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
17030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17040 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17050 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
17060 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17070 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
17080 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
17090 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
170a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
170b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
170c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
170d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
170e0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
170f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17100 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
17110 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
17120 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
17130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17140 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17160 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
17170 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
17180 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17190 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
171a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
171c0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
171d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
171e0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
171f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
17200 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
17210 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
17220 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
17230 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17240 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
17250 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
17260 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17270 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17290 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
172a0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
172b0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
172c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
172d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
172e0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
172f0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17310 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17320 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
17330 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
17340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
17350 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
17360 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17370 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17380 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17390 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
173a0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
173b0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
173c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
173d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
173e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
173f0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
17400 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
17410 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
17420 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
17430 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
17440 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
17450 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
17460 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
17470 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
17480 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17490 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
174a0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
174b0 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
174c0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
174d0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
174e0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
174f0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
17500 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
17510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17520 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
17530 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
17540 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
17550 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
17560 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
17570 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
17580 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
17590 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
175a0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
175b0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
175c0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
175d0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
175e0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
175f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
17600 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
17610 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
17620 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
17630 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
17640 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
17650 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
17660 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17670 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
17680 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
17690 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
176a0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
176b0 2a 2a 20 64 65 74 65 63 68 65 64 2e 20 20 54 68  ** deteched.  Th
176c0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
176d0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
176e0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
176f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
17700 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
17710 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17720 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
17730 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
17740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
17750 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17760 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17770 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
17780 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17790 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
177a0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
177b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
177c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
177d0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
177e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
177f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
17800 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32  ek(pPager->fd, 2
17810 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
17820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
17840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17860 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17870 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
17880 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
17890 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
178a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
178b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
178c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
178d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
178e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
178f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
17900 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
17910 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17920 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
17930 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
17940 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
17950 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
17960 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
17970 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
17980 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
17990 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
179a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
179b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
179c0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
179d0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
179e0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
179f0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
17a00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
17a10 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
17a20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17a30 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17a40 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
17a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17a60 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
17a70 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
17a80 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
17a90 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
17aa0 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
17ab0 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
17ac0 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
17ad0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
17ae0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
17af0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
17b00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17b10 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
17b20 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
17b30 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
17b40 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
17b50 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
17b60 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
17b70 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
17b80 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
17b90 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
17ba0 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
17bb0 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
17bc0 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
17bd0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
17be0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
17bf0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
17c00 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17c10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
17c20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
17c30 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
17c40 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
17c50 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
17c60 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
17c70 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
17c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
17c90 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
17ca0 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
17cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
17cc0 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
17cd0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
17ce0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
17cf0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
17d00 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
17d10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17d20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17d30 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
17d40 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
17d50 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
17d60 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
17d70 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
17d80 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
17d90 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
17da0 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
17db0 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
17dc0 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
17dd0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
17de0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
17df0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
17e00 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
17e10 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
17e20 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
17e30 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
17e40 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
17e50 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
17e60 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
17e70 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
17e80 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
17e90 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
17ea0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
17eb0 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
17ec0 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
17ed0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
17ee0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
17ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
17f00 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
17f10 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
17f20 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
17f30 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
17f40 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
17f50 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a  bove is met: */.
17f60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
17f70 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
17f80 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  ge.   || pPager-
17f90 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  >pFirst==0 .   |
17fa0 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
17fb0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17fc0 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
17fd0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29  ->doNotSync).  )
17fe0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
17ff0 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
18000 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
18010 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
18020 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
18030 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
18040 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
18050 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
18060 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
18070 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
18080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18090 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
180a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
180b0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
180c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
180d0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
180e0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
180f0 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
18100 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
18130 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
18140 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
18160 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
18170 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
18180 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
18190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
181a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
181b0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
181c0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
181d0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
181e0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
181f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
18200 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
18210 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
18220 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
18230 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
18240 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
18250 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
18260 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
18270 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
18280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
18290 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61  l = pPg;.    pPa
182a0 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
182b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
182c0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
182d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Page ){.      as
182e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
182f0 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d  axPage==(pPager-
18300 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20  >nPage-1) );.   
18310 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
18320 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  age++;.    }.  }
18330 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63  else{.    /* Rec
18340 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67  ycle an existing
18350 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72   page with a zer
18360 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a  o ref-count. */.
18370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
18380 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
18390 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
183a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
183b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
183c0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
183d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
183e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
183f0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
18400 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29  .    assert(pPg)
18410 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20  ;.  }.  *ppPg = 
18420 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f  pPg;..pager_allo
18430 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75  cate_out:.  retu
18440 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18450 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
18460 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  e the content fo
18470 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68  r a page.  If th
18480 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72  e page was.** pr
18490 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
184a0 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
184b0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ==1, then the co
184c0 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73  ntent was.** jus
184d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  t initialized to
184e0 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f   zeros instead o
184f0 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
18500 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e  m disk..** But n
18510 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65 20 72  ow we need the r
18520 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20  eal data off of 
18530 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73  disk.  So make s
18540 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69  ure we.** have i
18550 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20 69  t.  Read it in i
18560 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  f we do not have
18570 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a   it already..*/.
18580 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18590 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48  _get_content(PgH
185a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
185b0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b  pPg->needRead ){
185c0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65  .    int rc = re
185d0 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50  adDbPage(pPg->pP
185e0 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e  ager, pPg, pPg->
185f0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
18600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18610 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
18620 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ead = 0;.    }el
18630 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
18640 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
18650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18660 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
18670 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
18680 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
18690 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
186a0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
186b0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
186c0 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
186d0 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
186e0 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
186f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
18700 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
18710 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
18720 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
18730 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
18740 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
18750 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
18760 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
18770 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
18780 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
18790 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
187a0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
187b0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
187c0 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
187d0 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
187e0 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
187f0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
18800 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
18810 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
18820 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
18830 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
18840 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
18850 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
18860 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
18870 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
18880 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
18890 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
188a0 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
188b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
188c0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
188d0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
188e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
188f0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
18900 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
18910 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
18920 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
18930 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
18940 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
18950 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
18960 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
18970 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
18980 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
18990 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
189a0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
189b0 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
189c0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
189d0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
189e0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
189f0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
18a00 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
18a10 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
18a20 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
18a30 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
18a40 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
18a50 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
18a60 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
18a70 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
18a80 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
18a90 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
18aa0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
18ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
18ac0 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  tent is false, t
18ad0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
18ae0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65   are actually re
18af0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
18b00 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
18b10 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
18b20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
18b30 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
18b40 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
18b50 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
18b60 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f  me, so do not do
18b70 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a   a disk read.  J
18b80 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a  ust fill in the.
18b90 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
18ba0 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74  with zeros.  But
18bb0 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20 74   mark the fact t
18bc0 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hat we have not 
18bd0 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  read the.** cont
18be0 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20 74  ent by setting t
18bf0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
18c00 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f  d flag.  Later o
18c10 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65  n, if .** sqlite
18c20 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
18c30 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
18c40 70 61 67 65 20 6f 72 20 69 66 20 74 68 69 73 20  page or if this 
18c50 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61  routine is.** ca
18c60 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68 20  lled again with 
18c70 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68  noContent==0, th
18c80 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
18c90 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65  e content is nee
18ca0 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ded.** and the d
18cb0 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20  isk read should 
18cc0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
18cd0 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
18ce0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
18cf0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18d00 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
18d10 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
18d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18d30 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
18d40 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
18d50 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
18d60 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
18d70 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
18d80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18d90 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
18da0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
18db0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
18dc0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
18dd0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
18de0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
18df0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
18e00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
18e10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
18e20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
18e30 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
18e40 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20  | pgno==1 );..  
18e50 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
18e60 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
18e70 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
18e80 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
18e90 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
18ea0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
18eb0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
18ec0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
18ed0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
18ee0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
18ef0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
18f00 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
18f10 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
18f20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18f30 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
18f40 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
18f50 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
18f60 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
18f70 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
18f80 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
18f90 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
18fa0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18fb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
18fc0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
18fd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
18fe0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
18ff0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
19000 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
19010 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
19020 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
19030 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
19040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19050 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
19060 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
19070 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
19080 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
19090 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63   held..  */.  rc
190a0 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f   = pagerSharedLo
190b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
190c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
190d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
190e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
190f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
19100 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
19110 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
19120 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
19130 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
19140 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
19150 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
19160 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
19170 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
19180 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74  nt nMax;.    int
19190 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   h;.    PAGER_IN
191a0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
191b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
191c0 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50  rAllocatePage(pP
191d0 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20  ager, &pPg);.   
191e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
191f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19200 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
19210 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
19220 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
19230 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70  !MEMDB || pgno>p
19240 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
19250 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19260 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
19270 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
19280 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
19290 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
192a0 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
192b0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
192c0 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
192d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
192e0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
192f0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
19300 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
19310 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
19320 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
19330 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
19340 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
19350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19360 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
19370 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
19380 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
19390 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  }..    makeClean
193a0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
193b0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
193c0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20  FINFO(pPg);..   
193d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
193e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
193f0 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
19400 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
19410 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
19420 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
19430 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
19440 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
19450 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
19460 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
19470 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19480 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
19490 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
194a0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  g);.      rc = p
194b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
194c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
194d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
194e0 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
194f0 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
19500 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
19510 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
19520 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
19530 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
19540 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
19550 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
19560 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
19570 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e  o || MEMDB || (n
19580 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
19590 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
195a0 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  ack) ){.      me
195b0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
195c0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
195d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
195e0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
195f0 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26  ad = noContent &
19600 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
19610 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  sRollback;.     
19620 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
19630 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
19640 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
19650 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
19660 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
19670 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
19680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19690 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
196a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
196b0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
196c0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
196d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
196e0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
196f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19700 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
19710 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
19720 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
19730 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
19740 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
19750 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
19760 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
19770 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
19780 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
19790 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
197a0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
197b0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
197c0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
197d0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
197e0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
197f0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
19800 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
19810 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
19820 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
19830 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
19840 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
19850 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
19860 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
19870 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
19880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
19890 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
198a0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
198b0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
198c0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
198d0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
198e0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
198f0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
19900 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
19910 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
19920 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
19930 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
19940 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
19950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
19970 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
19980 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
19990 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
199a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
199b0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
199c0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
199d0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
199e0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
199f0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
19a00 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
19a10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
19a20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
19a30 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
19a40 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
19a50 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
19a60 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
19a70 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
19a80 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
19a90 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
19aa0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
19ab0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
19ac0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
19ad0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
19ae0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
19af0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
19b00 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
19b10 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
19b20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
19b30 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19b40 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
19b50 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
19b60 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
19b70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
19b80 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
19b90 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
19ba0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
19bb0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
19bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
19bd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19be0 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66  pgno!=0 );..  if
19bf0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
19c00 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
19c10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
19c20 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
19c30 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
19c40 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ode );.    retur
19c50 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
19c60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
19c70 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
19c80 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
19c90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19ca0 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
19cb0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
19cc0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
19cd0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
19ce0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
19cf0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
19d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
19d10 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
19d20 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
19d30 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
19d40 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
19d50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
19d60 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
19d70 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
19d80 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
19d90 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
19da0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
19db0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
19dc0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
19dd0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19de0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
19df0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
19e00 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
19e10 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65   *pPg){..  /* De
19e20 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
19e30 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
19e40 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
19e50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
19e60 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
19e70 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
19e80 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
19e90 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
19ea0 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
19eb0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
19ec0 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
19ed0 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
19ee0 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
19ef0 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
19f00 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
19f10 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
19f20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
19f30 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
19f40 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
19f50 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
19f60 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
19f70 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
19f80 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
19f90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
19fa0 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
19fb0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
19fc0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
19fd0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
19fe0 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
19ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
1a000 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
1a010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a020 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1a030 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
1a040 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
1a050 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
1a060 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
1a070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a080 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1a090 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
1a0a0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
1a0b0 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
1a0c0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1a0d0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
1a0e0 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
1a0f0 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
1a100 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
1a110 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
1a120 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1a130 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a140 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
1a150 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1a160 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
1a170 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1a180 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
1a190 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1a1a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1a1b0 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  0) ){.      page
1a1c0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1a1d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a1e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1a1f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a200 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
1a210 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
1a220 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
1a230 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
1a240 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
1a250 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1a260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a270 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1a280 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1a290 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1a2a0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1a2b0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
1a2c0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
1a2d0 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
1a2e0 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
1a2f0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1a300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a310 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1a320 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1a330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1a340 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1a350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a360 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1a370 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
1a380 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1a390 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1a3a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a3b0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1a3c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a3d0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1a3e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1a3f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1a400 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
1a410 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1a420 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
1a430 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1a440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1a450 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
1a460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a470 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
1a480 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1a490 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63  ournal;.  }.  rc
1a4a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1a4b0 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
1a4c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
1a4d0 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4f0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1a500 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
1a510 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1a520 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1a530 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67 65 72  >jfd );.  pPager
1a540 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1a550 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
1a560 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
1a570 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1a580 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1a590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a5a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1a5b0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
1a5c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
1a5d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1a5e0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
1a5f0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1a600 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71  ournal;.  }.  sq
1a610 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
1a620 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1a630 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
1a640 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
1a650 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
1a660 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1a670 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
1a680 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
1a690 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  ctory(pPager->jf
1a6a0 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  d, pPager->zDire
1a6b0 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72  ctory);.  pPager
1a6c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1a6d0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
1a6e0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1a6f0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
1a700 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
1a710 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1a720 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
1a730 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
1a740 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1a760 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1a770 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1a780 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1a790 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
1a7a0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1a7b0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
1a7c0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1a7d0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
1a7e0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
1a7f0 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
1a800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a810 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a820 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
1a830 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1a840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1a850 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
1a860 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1a870 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1a880 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1a890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a8a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a8b0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1a8c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a8d0 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
1a8e0 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
1a8f0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1a900 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
1a910 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a920 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
1a930 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
1a940 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
1a950 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a960 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
1a970 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
1a980 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
1a990 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
1a9a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
1a9b0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1a9c0 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
1a9d0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1a9e0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1a9f0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1aa00 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1aa10 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
1aa20 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1aa30 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1aa40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
1aa50 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
1aa60 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
1aa70 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
1aa80 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
1aa90 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
1aaa0 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
1aab0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1aac0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
1aad0 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
1aae0 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
1aaf0 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
1ab00 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
1ab10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1ab20 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1ab30 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
1ab40 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
1ab50 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
1ab60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1ab70 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
1ab80 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1ab90 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
1aba0 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
1abb0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
1abc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1abd0 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
1abe0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
1abf0 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
1ac00 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
1ac10 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
1ac20 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
1ac30 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1ac40 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
1ac50 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
1ac60 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
1ac70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ac80 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
1ac90 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
1aca0 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
1acb0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1acc0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1acd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1ace0 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
1acf0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
1ad00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ad10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1ad20 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
1ad30 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
1ad40 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
1ad50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
1ad60 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
1ad70 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
1ad80 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
1ad90 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
1ada0 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
1adb0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
1adc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1add0 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
1ade0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1adf0 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
1ae00 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
1ae10 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
1ae20 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ae30 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1ae40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1ae50 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1ae60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ae70 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1ae80 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
1ae90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1aea0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
1aeb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1aec0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1aed0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
1aee0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
1aef0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1af00 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1af10 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1af20 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1af30 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
1af40 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1af50 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1af60 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
1af70 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
1af80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1af90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1afa0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1afb0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
1afc0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
1afd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1afe0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1aff0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1b000 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
1b010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b020 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b050 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1b060 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1b070 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
1b080 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
1b090 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1b0a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1b0b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
1b0c0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
1b0d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1b0e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b0f0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1b100 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1b110 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1b120 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1b130 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1b140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
1b150 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
1b160 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
1b170 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
1b180 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1b190 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  de last.    ** t
1b1a0 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
1b1b0 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
1b1c0 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
1b1d0 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
1b1e0 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
1b1f0 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
1b200 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
1b210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
1b220 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
1b230 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61   open and trunca
1b240 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a  ted to 0 bytes..
1b250 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b260 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
1b270 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1b280 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
1b290 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
1b2a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1b2b0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1b2c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b2d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1b2e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1b2f0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1b300 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1b310 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1b320 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1b330 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->aInJournal ){
1b340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b350 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1b360 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1b370 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1b380 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1b390 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b3a0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1b3b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1b3c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1b3d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1b3e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b3f0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
1b400 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1b410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1b420 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
1b430 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
1b440 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
1b450 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
1b460 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1b470 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
1b480 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
1b490 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
1b4a0 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
1b4b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b4c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
1b4d0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
1b4e0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
1b4f0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
1b500 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b510 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
1b520 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
1b530 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
1b540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
1b550 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
1b560 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1b570 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
1b580 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1b590 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
1b5a0 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
1b5b0 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
1b5c0 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
1b5d0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1b5e0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
1b5f0 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
1b600 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1b610 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
1b620 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1b630 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
1b640 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
1b650 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1b660 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b  pPg->pPrevDirty;
1b670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b680 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29  Pg->pPrevDirty )
1b690 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
1b6a0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
1b6b0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1b6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b6d0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
1b6e0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1b6f0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  y;.    }.  }.}..
1b700 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1b710 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1b720 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1b730 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1b740 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1b750 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1b760 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1b770 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1b780 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1b790 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1b7a0 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1b7b0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1b7c0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1b7d0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1b7e0 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1b7f0 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1b800 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1b810 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1b820 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1b830 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1b840 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1b850 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1b860 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1b870 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1b880 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1b890 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1b8a0 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1b8b0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1b8c0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1b8d0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1b8e0 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1b8f0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1b900 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1b910 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1b920 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1b930 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1b940 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1b950 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1b960 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1b970 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1b980 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1b990 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1b9a0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1b9b0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1b9c0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1b9d0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1b9e0 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1b9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ba00 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1ba10 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1ba20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1ba30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ba40 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1ba50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1ba60 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
1ba70 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20  A(pPg);.  Pager 
1ba80 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1ba90 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1baa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1bab0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1bac0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1bad0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1bae0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1baf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1bb00 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1bb10 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1bb20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1bb30 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1bb40 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1bb50 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1bb60 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1bb70 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1bb80 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1bb90 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1bba0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74  Content==1, that
1bbb0 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64   means.  ** we d
1bbc0 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61  idn't really rea
1bbd0 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
1bbe0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54   of the page.  T
1bbf0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20  his can happen. 
1bc00 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65   ** (for example
1bc10 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  ) when the page 
1bc20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  is being moved t
1bc30 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  o the freelist. 
1bc40 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65   But.  ** now we
1bc50 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d   are (perhaps) m
1bc60 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f  oving the page o
1bc70 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ff of the freeli
1bc80 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73  st for.  ** reus
1bc90 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  e and we need to
1bca0 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e   know its origin
1bcb0 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68  al content so th
1bcc0 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  at content.  ** 
1bcd0 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1bce0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1bcf0 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68  urnal.  So do th
1bd00 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20  e read at this. 
1bd10 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20   ** time..  */. 
1bd20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1bd30 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1bd40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1bd50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1bd60 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1bd70 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1bd80 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1bd90 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1bda0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1bdb0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1bdc0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1bdd0 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
1bde0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
1bdf0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1be00 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d  && (pageInStatem
1be10 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67  ent(pPg) || pPag
1be20 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1be30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1be40 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1be50 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
1be60 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
1be70 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
1be80 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
1be90 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
1bea0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
1beb0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1bec0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
1bed0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
1bee0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
1bef0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
1bf00 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
1bf10 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1bf20 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
1bf30 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
1bf40 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1bf50 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
1bf60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bf70 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1bf80 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
1bf90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1bfa0 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  gin(pPg, 0);.   
1bfb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bfc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1bfd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1bfe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bff0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1c000 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
1c010 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1c020 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1c030 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
1c040 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c050 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1c060 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1c070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c090 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1c0a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c0b0 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
1c0c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
1c0d0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1c0e0 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
1c0f0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1c100 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
1c110 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
1c120 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
1c130 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1c140 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
1c150 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1c160 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
1c170 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
1c180 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
1c190 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
1c1a0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1c1b0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1c1c0 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
1c1d0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
1c1e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
1c1f0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
1c200 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1c210 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1c220 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1c230 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
1c240 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
1c250 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
1c260 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1c270 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1c280 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1c290 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c2a0 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
1c2b0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c2c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1c2d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c2e0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1c2f0 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
1c300 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1c310 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Orig = sqliteMal
1c320 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
1c330 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
1c340 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1c350 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
1c360 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
1c370 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
1c380 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1c390 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c3b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c3c0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
1c3d0 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  , saved;.       
1c3e0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 2c     char *pData2,
1c3f0 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20   *pEnd;.        
1c400 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
1c410 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
1c420 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1c430 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
1c440 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
1c450 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1c460 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
1c470 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
1c480 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
1c490 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1c4a0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1c4b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1c4c0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
1c4d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1c4e0 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43        pData2 = C
1c4f0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1c500 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1c510 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
1c520 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
1c530 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
1c540 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
1c550 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32 20    pEnd = pData2 
1c560 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1c570 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  ze;.          pD
1c580 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20  ata2 -= 4;.     
1c590 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
1c5a0 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20 20  32*)pEnd;.      
1c5b0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 45      put32bits(pE
1c5c0 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  nd, cksum);.    
1c5d0 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61        szPg = pPa
1c5e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b  ger->pageSize+8;
1c5f0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1c600 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1c610 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c620 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c630 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1c640 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50 67  fd, pData2, szPg
1c650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
1c660 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
1c670 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
1c680 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
1c690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1c6b0 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a  nalOff, szPg));.
1c6c0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f            PAGER_
1c6d0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1c6e0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
1c6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1c700 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1c710 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
1c720 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 4a    PAGERTRACE4("J
1c730 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c740 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1c750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c760 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1c770 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1c780 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
1c790 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a            *(u32*
1c7a0 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a  )pEnd = saved;..
1c7b0 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
1c7c0 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1c7d0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1c7e0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1c7f0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1c800 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
1c810 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
1c820 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
1c830 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1c840 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c860 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1c880 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c890 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
1c8a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c8b0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1c8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1c8d0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1c8e0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1c8f0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1c900 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
1c910 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1c920 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
1c930 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c940 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1c950 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1c960 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1c970 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1c980 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1c990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c9a0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1c9b0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
1c9c0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1c9d0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1c9e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1c9f0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ync;.        PAG
1ca00 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44  ERTRACE4("APPEND
1ca10 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1ca20 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1ca40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1ca50 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1ca60 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
1ca70 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
1ca80 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1ca90 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1caa0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1cab0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1cac0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
1cad0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1cae0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1caf0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1cb00 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1cb10 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1cb20 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1cb30 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1cb40 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1cb50 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1cb60 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1cb70 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1cb80 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1cb90 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1cba0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1cbb0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1cbc0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1cbd0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1cbe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cbf0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1cc00 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67  se .     && !pag
1cc10 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
1cc20 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29  ) .     && (int)
1cc30 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
1cc40 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20  r->stmtSize .   
1cc50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1cc60 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1cc70 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1cc80 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1cc90 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
1cca0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1ccb0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1ccc0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1ccd0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1cce0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ccf0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
1cd00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
1cd10 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
1cd20 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
1cd30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1cd40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1cd50 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1cd60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1cd70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
1cd80 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1cd90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cda0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1cdb0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1cdc0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1cdd0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1cde0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1cdf0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1ce00 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1ce10 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1ce20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ce30 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1ce40 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1ce50 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1ce60 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20  gno, 7)-4;.     
1ce70 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1ce80 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1ce90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1cea0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1ceb0 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
1cec0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1ced0 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
1cee0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
1cef0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1cf00 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1cf10 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1cf20 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
1cf30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cf40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1cf50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1cf60 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1cf70 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
1cf80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cf90 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
1cfa0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
1cfb0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1cfc0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1cfd0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1cfe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cff0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1d000 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
1d010 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
1d020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d030 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1d040 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
1d050 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
1d060 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
1d070 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1d080 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
1d090 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
1d0a0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
1d0b0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
1d0c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1d0d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d0e0 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
1d0f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d110 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1d120 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
1d130 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
1d140 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
1d150 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
1d160 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1d170 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
1d180 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
1d190 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
1d1a0 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
1d1b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1d1c0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1d1d0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
1d1e0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
1d1f0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
1d200 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1d210 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
1d220 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
1d230 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
1d240 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
1d250 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
1d260 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
1d270 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
1d280 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
1d290 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
1d2a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1d2b0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
1d2c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1d2d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
1d2e0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1d2f0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1d300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d310 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1d320 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1d330 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d340 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
1d350 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
1d360 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1d370 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1d380 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44  e);..  if( !MEMD
1d390 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
1d3a0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1d3b0 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1d3c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1d3d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d3e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1d3f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1d400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d410 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1d420 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1d430 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1d440 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1d450 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1d470 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1d480 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1d490 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  */.    int ii;..
1d4a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
1d4b0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
1d4c0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
1d4d0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
1d4e0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
1d4f0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
1d500 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
1d510 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
1d520 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
1d530 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
1d540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d550 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1d560 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1d570 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1d580 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1d590 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1d5a0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1d5b0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1d5c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1d5d0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1d5e0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1d5f0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1d600 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1d610 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1d620 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1d630 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1d640 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1d650 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1d660 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1d670 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1d680 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
1d690 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1d6a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1d6b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
1d6c0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
1d6d0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
1d6e0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
1d6f0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
1d700 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
1d710 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
1d720 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1d730 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
1d740 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
1d750 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1d760 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
1d770 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d780 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
1d790 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
1d7a0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
1d7b0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
1d7c0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
1d7d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1d7e0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1d7f0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
1d800 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
1d810 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  i;.      if( !pP
1d820 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1d830 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e   || pg==pPg->pgn
1d840 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  o || .          
1d850 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  pg>pPager->origD
1d860 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65  bSize || !(pPage
1d870 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1d880 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29  /8]&(1<<(pg&7)))
1d890 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20  .      ) {.     
1d8a0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
1d8b0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1d8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
1d8d0 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
1d8e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d8f0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1d900 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
1d910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d930 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1d940 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1d950 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d960 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d970 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1d980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d9a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d9b0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
1d9c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1d9d0 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
1d9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1d9f0 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
1da00 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1da10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1da20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1da30 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
1da40 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
1da50 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
1da60 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
1da70 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
1da80 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1da90 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
1daa0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
1dab0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
1dac0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
1dad0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1dae0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1daf0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
1db00 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
1db10 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
1db20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1db30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
1db40 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
1db50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1db60 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
1db70 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
1db80 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
1db90 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
1dba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1dbb0 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  rOverwrite(Pager
1dbc0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1dbd0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
1dbe0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1dbf0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
1dc00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1dc10 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1dc20 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
1dc30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dc40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1dc50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
1dc60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dc70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
1dc80 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67  emcpy(sqlite3Pag
1dc90 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20  erGetData(pPg), 
1dca0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1dcb0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1dcc0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1dcd0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  Unref(pPg);.  }.
1dce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1dcf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1dd00 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1dd10 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1dd20 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1dd30 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1dd40 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1dd50 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1dd60 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
1dd70 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1dd80 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1dd90 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1dda0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1ddb0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1ddc0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1ddd0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1dde0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1ddf0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1de00 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1de10 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1de20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1de30 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1de40 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1de50 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1de60 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1de70 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1de80 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1de90 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1dea0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1deb0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1dec0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1ded0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1dee0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1def0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1df00 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1df10 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1df20 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1df30 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1df40 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1df50 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1df60 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1df70 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1df80 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1df90 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1dfa0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1dfb0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1dfc0 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1dfd0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1dfe0 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1dff0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1e000 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1e010 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1e020 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1e030 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1e040 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1e050 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1e060 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1e070 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1e080 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1e090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1e0a0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1e0b0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1e0c0 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1e0d0 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1e0e0 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1e0f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e100 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1e110 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1e120 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1e130 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1e140 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1e150 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1e160 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1e170 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1e180 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1e190 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1e1a0 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1e1b0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1e1c0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1e1d0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
1e1e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e1f0 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  tWrite(DbPage *p
1e200 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  DbPage){.  PgHdr
1e210 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
1e220 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e230 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1e240 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
1e250 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c  eturn;.  pPg->al
1e260 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1e270 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
1e280 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
1e290 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1e2a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e2b0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1e2c0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1e2d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1e2e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
1e2f0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1e300 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
1e310 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
1e320 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
1e330 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1e340 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
1e350 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
1e360 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
1e370 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1e380 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
1e390 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
1e3a0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
1e3b0 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
1e3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
1e3d0 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
1e3e0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1e3f0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
1e400 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
1e410 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
1e420 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
1e430 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
1e440 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
1e450 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
1e460 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
1e470 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
1e480 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
1e490 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
1e4a0 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
1e4b0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
1e4c0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
1e4d0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
1e4e0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
1e4f0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
1e500 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1e510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e520 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
1e530 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
1e540 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1e550 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1e560 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
1e570 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
1e580 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e590 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
1e5a0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
1e5b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1e5c0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1e5d0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1e5e0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1e5f0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1e600 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1e610 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1e620 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1e630 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
1e640 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1e650 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
1e660 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
1e670 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
1e680 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
1e690 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
1e6a0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
1e6b0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
1e6c0 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
1e6d0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
1e6e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e6f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61  ..**.** If we ha
1e700 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61  ve not yet actua
1e710 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e  lly read the con
1e720 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  tent of this pag
1e730 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48  e (if.** the PgH
1e740 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
1e750 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68   is set) then th
1e760 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
1e770 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20  as a promise.** 
1e780 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76  that we will nev
1e790 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20  er need to read 
1e7a0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1e7b0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
1e7c0 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65  ** so the needRe
1e7d0 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63  ad flag can be c
1e7e0 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70  leared at this p
1e7f0 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oint..*/.void sq
1e800 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1e810 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70  llback(DbPage *p
1e820 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1e830 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e840 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
1e850 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1e860 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1e870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1e880 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
1e890 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
1e8a0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e8b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
1e8c0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
1e8d0 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1e8e0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1e8f0 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1e900 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1e910 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1e920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e930 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1e940 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1e950 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1e960 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1e970 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1e980 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e990 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  = 1;.    pPg->ne
1e9a0 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1e9b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e9c0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
1e9d0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1e9e0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1e9f0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1ea00 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52  .    }.    PAGER
1ea10 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1ea20 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1ea30 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1ea40 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1ea50 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  r));.    IOTRACE
1ea60 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64  (("GARBAGE %p %d
1ea70 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1ea80 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69  ->pgno)).  }.  i
1ea90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1eaa0 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70 61 67  nUse .   && !pag
1eab0 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
1eac0 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70 50  ) .   && (int)pP
1ead0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1eae0 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a  >stmtSize .  ){.
1eaf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1eb00 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
1eb10 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
1eb20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1eb30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1eb40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
1eb50 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1eb60 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1eb70 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1eb80 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d  ->pgno&7);.  }.}
1eb90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1eba0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1ebb0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
1ebc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
1ebd0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
1ebe0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
1ebf0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
1ec00 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1ec10 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
1ec20 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
1ec30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ec40 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
1ec50 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1ec60 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
1ec70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
1ec80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
1ec90 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  {.    /* Open pa
1eca0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1ecb0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1ecc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ecd0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1ece0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
1ecf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ed00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ed10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ed20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1ed30 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1ed40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1ed50 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20  turn rc;.  .    
1ed60 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
1ed70 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
1ed80 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1ed90 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1eda0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1edb0 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20  Hdr, 24);.  .   
1edc0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1edd0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1ede0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1edf0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1ee00 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
1ee10 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
1ee20 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
1ee30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1ee40 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
1ee50 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20  _counter);.  .  
1ee60 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
1ee70 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1ee80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
1ee90 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
1eea0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
1eeb0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1eec0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1eed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1eee0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
1eef0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1ef00 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
1ef10 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1ef20 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
1ef30 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1ef40 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1ef50 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1ef60 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
1ef70 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
1ef80 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
1ef90 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
1efa0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1efb0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
1efc0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
1efd0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1efe0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
1eff0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
1f000 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
1f010 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
1f020 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
1f030 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
1f040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1f050 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1f060 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
1f070 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
1f080 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
1f090 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1f0a0 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
1f0b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
1f0c0 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
1f0d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1f0e0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
1f0f0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
1f100 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
1f110 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
1f120 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
1f130 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
1f140 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
1f150 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1f160 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
1f170 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1f180 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
1f190 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
1f1a0 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
1f1b0 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
1f1c0 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
1f1d0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1f1e0 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
1f1f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1f200 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1f210 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1f220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1f230 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
1f240 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
1f250 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47  QLITE_OK;..  PAG
1f260 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
1f270 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
1f280 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
1f290 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
1f2a0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f2b0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
1f2c0 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
1f2d0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1f2e0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
1f2f0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
1f300 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
1f310 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1f320 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f330 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1f340 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1f350 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1f360 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
1f370 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
1f380 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
1f390 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1f3a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1f3b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f3c0 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n );..    /* If 
1f3d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f3e0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
1f3f0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f400 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
1f410 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
1f420 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
1f430 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
1f440 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
1f450 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
1f460 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
1f470 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
1f480 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
1f490 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
1f4a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1f4b0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
1f4c0 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
1f4d0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
1f4e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1f4f0 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
1f500 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
1f510 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
1f520 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1f530 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1f540 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1f550 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1f560 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
1f570 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f580 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f590 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64  sync_exit;.#ifnd
1f5a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f5b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1f5c0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1f5d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1f5e0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
1f5f0 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
1f600 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
1f610 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
1f620 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
1f630 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
1f640 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
1f650 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1f660 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1f670 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
1f680 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1f690 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  no i;.        in
1f6a0 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1f6b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1f6c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
1f6d0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1f6e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1f6f0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1f700 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
1f710 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
1f720 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26  & (1<<(i&7))) &&
1f730 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
1f740 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f750 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1f760 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a  ager, i, &pPg);.
1f770 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f790 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f7b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f7c0 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
1f7d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f7e0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1f7f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f810 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f830 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   } .      }.#end
1f840 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  if.      rc = wr
1f850 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
1f860 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1f870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f890 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f8a0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1f8b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1f8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f8d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f8e0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  _exit;.    }..#i
1f8f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f900 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1f910 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1f920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f930 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1f940 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1f950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f970 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f980 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1f990 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1f9a0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1f9b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1f9c0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1f9d0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1f9e0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1f9f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1fa00 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1fa10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fa20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1fa30 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61  nc_exit;.    pPa
1fa40 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1fa50 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
1fa60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fa70 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1fa80 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1fa90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1faa0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1fab0 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  fd, 0);.    }.  
1fac0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
1fad0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
1fae0 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ))..    pPager->
1faf0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1fb00 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NCED;.  }else if
1fb10 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e  ( MEMDB && nTrun
1fb20 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c!=0 ){.    rc =
1fb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fb40 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1fb50 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63  runc);.  }..sync
1fb60 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
1fb70 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
1fb80 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
1fb90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fba0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1fbb0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
1fbc0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
1fbd0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
1fbe0 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
1fbf0 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
1fc00 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
1fc10 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1fc20 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
1fc30 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
1fc40 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1fc50 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1fc60 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1fc70 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
1fc80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1fc90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1fca0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1fcb0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
1fcc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1fcd0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1fce0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
1fcf0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
1fd00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41  _ERROR;.  }.  PA
1fd20 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
1fd30 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1fd40 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1fd50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1fd60 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1fd70 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1fd80 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
1fd90 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50  ( pPg ){.      P
1fda0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1fdb0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1fdc0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1fdd0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1fde0 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
1fdf0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1fe00 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1fe10 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1fe20 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
1fe30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1fe40 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
1fe50 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
1fe60 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
1fe70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1fe80 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
1fe90 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
1fea0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1feb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1fec0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1fed0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
1fee0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
1fef0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1ff00 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1ff10 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1ff20 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1ff30 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
1ff40 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1ff50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
1ff60 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
1ff70 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1ff80 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
1ff90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
1ffa0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1ffb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1ffc0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1ffd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1ffe0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1fff0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
20000 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
20010 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20030 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20040 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
20050 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20060 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
20070 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20080 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
20090 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
200a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
200b0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
200c0 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
200d0 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
200e0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
200f0 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
20100 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20110 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
20120 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
20130 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
20140 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
20150 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
20160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
20170 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
20180 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
20190 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
201a0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
201b0 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
201c0 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
201d0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
201e0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
201f0 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
20200 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
20210 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
20220 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
20230 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
20240 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
20250 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
20260 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
20270 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
20280 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
20290 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
202a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
202b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
202c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
202d0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
202e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
202f0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
20300 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
20310 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20320 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
20330 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
20340 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
20350 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
20360 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
20370 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
20380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
20390 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
203a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
203b0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
203c0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
203d0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
203e0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
203f0 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
20400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
20410 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
20420 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
20430 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
20440 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
20450 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
20460 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
20470 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
20480 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
20490 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
204a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
204b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
204c0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
204d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
204e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
204f0 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
20500 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
20510 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
20520 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
20530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20540 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
20550 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
20560 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
20570 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
20580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20590 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
205a0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
205b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
205c0 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
205d0 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
205e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
205f0 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
20600 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
20610 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20620 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
20630 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
20640 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
20650 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
20660 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
20670 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
20680 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
20690 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
206a0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
206b0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
206c0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
206d0 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
206e0 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
206f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
20700 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
20710 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20720 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
20730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20740 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
20750 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20760 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
20770 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
20780 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
20790 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
207a0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
207b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
207c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
207d0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
207e0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
207f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
20800 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20810 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
20820 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
20830 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20840 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
20850 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
20860 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
20870 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
20880 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
20890 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
208a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
208b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
208c0 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
208d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
208e0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
208f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20900 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
20910 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20920 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20930 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20940 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
20950 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
20960 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
20970 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
20980 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20990 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
209a0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
209b0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
209c0 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
209d0 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
209e0 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
209f0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
20a00 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
20a10 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
20a20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
20a30 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
20a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20a50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
20a60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
20a70 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
20a80 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
20a90 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
20aa0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
20ab0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
20ac0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
20ad0 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
20ae0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
20af0 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
20b00 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
20b10 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
20b20 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20b30 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
20b40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
20b50 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
20b60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
20b70 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
20b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
20b90 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
20ba0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
20bb0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
20bc0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
20bd0 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
20be0 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
20bf0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
20c00 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
20c10 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
20c20 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
20c30 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
20c40 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
20c50 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
20c60 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
20c70 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
20c80 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
20c90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20ca0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
20cb0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
20cc0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
20cd0 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
20ce0 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
20cf0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
20d00 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
20d10 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
20d20 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
20d30 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
20d40 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
20d50 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
20d60 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
20d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
20d80 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
20d90 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
20da0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
20db0 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
20dc0 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
20dd0 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
20de0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
20df0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
20e00 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
20e10 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
20e20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
20e30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
20e40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20e50 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
20e60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20e70 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
20e80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
20e90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20ea0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20eb0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
20ec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
20ed0 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
20ee0 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
20ef0 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
20f00 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20f10 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
20f20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
20f30 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
20f40 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
20f50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20f60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20f70 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
20f80 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
20f90 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
20fa0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
20fb0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20fe0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
20ff0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
21000 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
21010 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
21020 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
21030 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
21040 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
21050 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
21060 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
21070 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
21080 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21090 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
210a0 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
210b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
210c0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
210d0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
210e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
210f0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
21100 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
21110 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
21120 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21130 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
21140 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
21150 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
21160 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
21170 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
21180 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
21190 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
211a0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
211b0 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
211c0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
211d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
211e0 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
211f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21200 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
21210 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
21220 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
21230 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
21240 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
21250 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
21260 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
21270 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
21280 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
21290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
212a0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
212b0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
212c0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
212d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
212e0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
212f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
21300 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
21310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21320 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
21330 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
21340 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
21350 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
21360 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
21370 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21380 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
21390 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
213a0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
213b0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
213c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
213d0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
213e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
213f0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
21400 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
21410 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
21420 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
21430 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
21440 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
21450 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
21460 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
21470 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
21480 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
21490 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
214a0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
214b0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
214c0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
214d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
214e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
214f0 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
21500 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
21510 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
21520 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
21530 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
21540 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
21550 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
21560 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
21570 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
21580 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
21590 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
215a0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
215b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
215c0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
215d0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
215e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
215f0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
21600 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
21610 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
21620 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
21630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
21650 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
21660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21670 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
21680 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21690 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
216a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
216b0 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
216c0 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
216d0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
216e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
216f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
21700 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
21710 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
21720 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66   *pHist;.      f
21730 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
21740 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
21750 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29  Hist->pNextStmt)
21760 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20  {.        pHist 
21770 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
21780 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
21790 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
217a0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
217b0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
217c0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
217d0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
217e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
217f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21800 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
21810 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
21820 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
21830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21840 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
21850 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
21860 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
21870 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
21880 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
21890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
218a0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
218b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
218c0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
218d0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
218e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
218f0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
21900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21910 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21920 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21930 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
21940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21950 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21960 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21980 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21990 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
219a0 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
219b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
219c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
219d0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
219e0 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
219f0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
21a00 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
21a10 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21a20 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
21a30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21a40 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
21a50 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
21a60 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
21a70 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
21a80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
21a90 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
21aa0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
21ab0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
21ac0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21ad0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
21ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21af0 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
21b00 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
21b10 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
21b20 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
21b30 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
21b40 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
21b50 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
21b60 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
21b70 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
21b80 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21b90 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
21ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
21bb0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
21bc0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
21bd0 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
21be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21bf0 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
21c00 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
21c10 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
21c20 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
21c30 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
21c40 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
21c50 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
21c60 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
21c70 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
21c80 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
21c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21ca0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
21cb0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
21cc0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
21cd0 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
21ce0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
21cf0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
21d00 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
21d10 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
21d20 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
21d30 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
21d40 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
21d50 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
21d60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
21d70 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
21d80 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
21d90 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
21da0 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
21db0 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
21dc0 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
21dd0 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
21de0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
21df0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
21e00 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
21e10 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
21e20 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
21e30 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
21e40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21e50 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
21e60 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
21e70 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
21e80 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
21e90 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
21ea0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
21eb0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
21ec0 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
21ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
21ee0 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
21ef0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21f00 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
21f10 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
21f20 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
21f30 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
21f40 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
21f50 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
21f60 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
21f70 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
21f80 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
21f90 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
21fa0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
21fb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
21fc0 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
21fd0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
21fe0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
21ff0 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
22000 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
22010 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
22020 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
22030 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
22040 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
22050 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
22060 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
22070 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
22080 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
22090 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
220a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
220b0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
220c0 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
220d0 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
220e0 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
220f0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
22100 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70   pgno))..  if( p
22110 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
22120 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
22130 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
22140 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
22150 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
22160 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
22170 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
22180 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
22190 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
221a0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
221b0 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
221c0 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
221d0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
221e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
221f0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
22200 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
22210 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
22220 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
22230 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
22240 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
22250 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
22260 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
22270 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
22280 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
22290 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
222a0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
222b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
222c0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
222d0 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
222e0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
222f0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
22300 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
22310 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
22320 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
22330 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
22340 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
22350 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
22360 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50  Old);.    if( pP
22370 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
22380 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22390 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
223a0 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
223b0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
223c0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
223d0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
223e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
223f0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
22400 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
22410 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
22420 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
22430 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
22440 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
22450 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
22460 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
22470 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
22480 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
22490 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
224a0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
224b0 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
224c0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
224d0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
224e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
224f0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
22500 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
22510 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
22520 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
22530 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
22540 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
22550 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
22560 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
22570 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
22580 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
22590 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
225a0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
225b0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
225c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
225d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
225e0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
225f0 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
22600 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
22610 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
22620 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
22630 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
22640 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
22650 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
22660 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
22670 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
22680 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
22690 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
226a0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
226b0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
226c0 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
226d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
226e0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
226f0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
22700 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
22710 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
22720 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
22730 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
22740 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
22750 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
22760 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
22770 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
22780 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
22790 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
227a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50     int rc;.    P
227b0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
227c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
227d0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
227e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
227f0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
22800 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
22810 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
22820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22830 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
22840 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
22850 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
22860 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
22870 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
22880 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
22890 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
228a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
228b0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
228c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
228d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
228e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
228f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22900 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
22910 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
22920 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
22930 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
22940 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
22950 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
22960 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
22970 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22980 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
22990 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
229a0 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
229b0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
229c0 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
229d0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
229e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
229f0 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
22a00 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
22a10 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
22a20 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
22a30 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
22a40 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
22a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
22a60 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
22a70 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
22a80 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
22a90 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
22aa0 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
22ab0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
22ac0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22ad0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
22ae0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22af0 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
22b00 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
22b10 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
22b20 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
22b30 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
22b40 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
22b50 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
22b60 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
22b70 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
22b80 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22b90 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
22ba0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22bb0 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
22bc0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
22bd0 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
22be0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
22bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22c00 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
22c10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22c20 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
22c30 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
22c40 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
22c50 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
22c60 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
22c70 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
22c90 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
22ca0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22cb0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
22cc0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22cd0 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
22ce0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
22cf0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
22d00 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
22d10 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
22d20 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
22d30 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
22d40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
22d50 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
22d60 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
22d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
22d80 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
22d90 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
22da0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22db0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
22dc0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
22dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22de0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
22df0 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
22e00 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
22e10 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
22e20 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
22e30 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
22e40 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
22e50 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
22e60 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
22e70 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
22e80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
22e90 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
22ea0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
22eb0 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
22ec0 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
22ed0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
22ee0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
22ef0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
22f00 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
22f10 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
22f20 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
22f30 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22f40 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
22f50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22f60 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
22f70 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
22f80 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
22f90 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
22fa0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
22fb0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
22fc0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22fd0 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
22fe0 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
22ff0 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
23000 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
23010 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
23020 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
23030 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
23040 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
23050 4f 20 2a 2f 0a                                   O */.