/ Hex Artifact Content
Login

Artifact e1ee86ae8d09c84bcd91900ade250776d83e3c72:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 32  : pager.c,v 1.32
0350: 34 20 32 30 30 37 2f 30 34 2f 30 36 20 31 38 3a  4 2007/04/06 18:
0360: 32 33 3a 31 38 20 64 72 68 20 45 78 70 20 24 0a  23:18 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 50 67  ll pages */.  Pg
1b30: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1b40: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1b50: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1b60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1b70: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b80: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1ba0: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1bb0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1bc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bf0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1c00: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1c10: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1c40: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1c50: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1c60: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
1c90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
1ca0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
1cb0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1cd0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
1ce0: 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61  ck() for this pa
1cf0: 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ge */.  short in
1d00: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d20: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
1d30: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1d40: 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65  r *pDirty, *pPre
1d50: 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69  vDirty;    /* Di
1d60: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  rty pages */.  u
1d70: 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20  32 notUsed;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d90: 20 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f   Buffer space */
1da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1db0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32  HECK_PAGES.  u32
1dc0: 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69   pageHash;.#endi
1dd0: 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  f.  /* pPager->p
1de0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1df0: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1e00: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1e10: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
1e20: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
1e30: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
1e40: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
1e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
1e60: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
1e70: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1e80: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1e90: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1ea0: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1eb0: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1ec0: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1ed0: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1ee0: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1ef0: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1f00: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1f10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
1f20: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
1f30: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
1f40: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
1f50: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
1f60: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
1f70: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1f80: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1f90: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1fa0: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1fb0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1fc0: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1fd0: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1fe0: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1ff0: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
2000: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
2010: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
2020: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
2030: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
2040: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
2050: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
2060: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
2070: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
2080: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
2090: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
20a0: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
20b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
20c0: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
20d0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
20e0: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
20f0: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
2100: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
2110: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
2120: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
2130: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
2140: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
2150: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
2160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
2170: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
2180: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
2190: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
21a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21b0: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
21c0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
21d0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
21e0: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
21f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2200: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
2210: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
2220: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
2230: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
2240: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2250: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
2260: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
2270: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
2280: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
2290: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
22a0: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
22b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
22c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
22d0: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
22e0: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
22f0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
2300: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
2310: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
2320: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
2330: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
2340: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
2350: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
2360: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2370: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
2380: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
2390: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
23a0: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
23b0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
23c0: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
23d0: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
23e0: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
23f0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
2400: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
2410: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
2420: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
2430: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2450: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
2460: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
2470: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
2480: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
2490: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
24a0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
24b0: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
24c0: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
24d0: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
24e0: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
24f0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
2500: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
2510: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
2520: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
2530: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
2540: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
2550: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
2560: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
2570: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
2580: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
2590: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
25a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
25b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
25c0: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
25d0: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
25e0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
25f0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
2600: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
2610: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
2620: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
2630: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
2640: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
2650: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
2660: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2670: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
2680: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
2690: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
26a0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
26c0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
26d0: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
26e0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2700: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2710: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2720: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2730: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2740: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2750: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2760: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2770: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
2780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2790: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
27a0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
27b0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
27c0: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
27e0: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
27f0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
2800: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
2810: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
2820: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
2830: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
2840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
2850: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
2860: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2880: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
2890: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
28a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
28c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
28d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
28e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
28f0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
2900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2910: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
2920: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
2930: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2950: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
2960: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
2970: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
2980: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
2990: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
29a0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
29b0: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
29c0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29e0: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
29f0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
2a00: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a20: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
2a30: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
2a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2a50: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a70: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
2a80: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
2a90: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
2aa0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2ab0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
2ac0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
2ad0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2ae0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b00: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2b10: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2b20: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b40: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2b50: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2b60: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2b70: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b90: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2ba0: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2bb0: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2bc0: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2bd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2be0: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
2bf0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
2c00: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
2c10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2c20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2c30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2c40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2c50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2c60: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2c80: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2c90: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2ca0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cc0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2cd0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
2ce0: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2d00: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2d10: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
2d20: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
2d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d40: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2d50: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
2d60: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2d70: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2da0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
2db0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2dc0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
2dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2de0: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2df0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2e00: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2e10: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e30: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2e40: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2e50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2e60: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2e70: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
2e80: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
2e90: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2ea0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
2eb0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2ed0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
2ee0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f10: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2f20: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  es */.  int nMax
2f30: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f40: 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65      /* High wate
2f50: 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20  r mark of nPage 
2f60: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2f90: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2fa0: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2fe0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2ff0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
3000: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
3010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3020: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3030: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
3040: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3050: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3080: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3090: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
30a0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
30b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
30c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30d0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
30e0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
30f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3110: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
3120: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
3130: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
3140: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
3150: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
3160: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20  /.  OsFile *fd, 
3170: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
3180: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3190: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
31a0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20    OsFile *stfd; 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
31f0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
3200: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
3210: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3220: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3230: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3240: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3250: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
3260: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
3270: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
3280: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
3290: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
32a0: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
32b0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
32c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
32d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
32f0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3300: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
3310: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3320: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3330: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3340: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
3350: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
3380: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3390: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
33a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
33b0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
33c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
33d0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33f0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
3400: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3410: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
3420: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3440: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
3450: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3460: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3470: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3490: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
34a0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
34b0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
34c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
34d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
34e0: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
34f0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
3500: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3510: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3530: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
3540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3550: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3560: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
3570: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
3580: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
3590: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
35a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
35b0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
35c0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
35d0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
35e0: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
35f0: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3600: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3610: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3620: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3630: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3640: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
3650: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3660: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
3670: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
3680: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
3690: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
36a0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
36b0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
36c0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
36d0: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
36e0: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
36f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3700: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
3710: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
3720: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3740: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
3750: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
3760: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3780: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
3790: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
37a0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
37b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37c0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
37d0: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
37e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37f0: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3800: 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69 73  f pagers in this
3810: 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69   thread */.#endi
3820: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
3830: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
3840: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
3850: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
3860: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
3870: 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f 75    u32 iChangeCou
3880: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
3890: 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   Db change-count
38a0: 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61 63  er for which cac
38b0: 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d  he is valid */.}
38c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  ;../*.** If SQLI
38d0: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
38e0: 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  ed then incremen
38f0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67  t the variable g
3900: 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61  iven in.** the a
3910: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65  rgument.*/.#ifde
3920: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20  f SQLITE_TEST.# 
3930: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3940: 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23  (x)  x++.#else.#
3950: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3960: 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(x).#endif../*.
3970: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
3980: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
3990: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
39a0: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
39b0: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
39c0: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
39d0: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
39e0: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
39f0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
3a00: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
3a10: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
3a20: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
3a30: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
3a40: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
3a50: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
3a60: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
3a70: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
3a80: 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74  is begin.** writ
3a90: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
3aa0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
3ab0: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
3ac0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
3ad0: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
3ae0: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
3af0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
3b00: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
3b10: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
3b20: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
3b30: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
3b40: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3b50: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3b60: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3b70: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3b80: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
3b90: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
3ba0: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
3bb0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
3bc0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
3bd0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
3be0: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
3bf0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
3c00: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
3c10: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
3c20: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
3c30: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
3c40: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3c50: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3c60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3c70: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
3c80: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
3c90: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
3ca0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
3cb0: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
3cc0: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
3cd0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3ce0: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
3cf0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
3d00: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
3d10: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
3d20: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
3d30: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
3d40: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3d50: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3d60: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3d70: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3d80: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
3d90: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
3da0: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
3db0: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
3dc0: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
3dd0: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
3de0: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
3df0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
3e00: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
3e10: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
3e20: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
3e30: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
3e40: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3e50: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3e60: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3e70: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3e80: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3e90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
3ea0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
3eb0: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
3ec0: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
3ed0: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
3ee0: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
3ef0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
3f00: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
3f10: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
3f20: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
3f30: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
3f40: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
3f50: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3f60: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
3f70: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
3f80: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
3f90: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
3fa0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
3fb0: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
3fc0: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
3fd0: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
3fe0: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
3ff0: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
4000: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
4010: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
4020: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
4030: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
4040: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
4050: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
4060: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
4070: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
4080: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
4090: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
40a0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
40b0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
40c0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
40d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
40e0: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
40f0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
4100: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
4110: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
4120: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
4130: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
4140: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
4150: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
4160: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
4170: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
4180: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
4190: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
41a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
41b0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
41c0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
41d0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
41e0: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
41f0: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
4200: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
4210: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
4220: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
4230: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
4240: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
4250: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
4260: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
4270: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
4280: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
4290: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
42a0: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
42b0: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
42c0: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
42d0: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
42e0: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
42f0: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
4300: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
4310: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
4320: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
4330: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
4340: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
4350: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
4360: 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50  .*/./* #define P
4370: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
4380: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
4390: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a  x)->pageSize)) *
43a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
43b0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e  MJ_PGNO(x) ((PEN
43c0: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
43d0: 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f  pageSize))+1)../
43e0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
43f0: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
4400: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
4410: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
4420: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
4430: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e  483647../*.** En
4440: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
4450: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66  ount tracking (f
4460: 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68 65  or debugging) he
4470: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
4480: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
4490: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
44a0: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
44b0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
44c0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
44d0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
44e0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
44f0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
4500: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
4510: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
4520: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
4530: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
4540: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33  addr=%p nRef=%-3
4550: 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
4560: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4570: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4580: 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61   p->nRef, p->pPa
4590: 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  ger->nRef.    );
45a0: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
45b0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
45c0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
45d0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
45e0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
45f0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
4600: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4610: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4620: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4630: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4640: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4650: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4660: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4670: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4680: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4690: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
46a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
46b0: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
46c0: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
46d0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
46e0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
46f0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
4700: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
4710: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
4720: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4730: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4740: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4750: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4760: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4770: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4780: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4790: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
47a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
47b0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
47c0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
47d0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
47e0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
47f0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
4800: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
4810: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
4820: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4830: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4840: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4850: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4860: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4870: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4880: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4890: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
48a0: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
48b0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
48c0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
48d0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
48e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
48f0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
4900: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4910: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4920: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4930: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4940: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4950: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4960: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4970: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4980: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4990: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
49a0: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
49b0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
49c0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
49d0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
49e0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
49f0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
4a00: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4a10: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4a20: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4a30: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4a50: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4a60: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4a70: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4a80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4a90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4aa0: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4ab0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4ac0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ad0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4ae0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4af0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4b00: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4b10: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4b20: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4b30: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4b40: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4b50: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4b60: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4b70: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4b80: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4b90: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4ba0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4bb0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4bc0: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4bd0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4be0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4bf0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4c00: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4c10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4c20: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4c30: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4c40: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4c50: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4c60: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4c70: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4c80: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4c90: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4ca0: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4cb0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4cc0: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4cd0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4ce0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4cf0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4d00: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4d10: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4d20: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4d30: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4d40: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4d50: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4d60: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4d70: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4d80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4d90: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4da0: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4db0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4dc0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4dd0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4de0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4df0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4e00: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4e10: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4e20: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4e30: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4e40: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4e50: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4e60: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4e70: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4e80: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4e90: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4ea0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4eb0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4ec0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ed0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4ee0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ef0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4f00: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4f10: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4f20: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4f30: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4f40: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
4f50: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
4f60: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4f70: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4f80: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4f90: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4fa0: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4fb0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4fc0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4fe0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4ff0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
5000: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
5010: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
5020: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5030: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5040: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5050: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5060: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5070: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5080: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5090: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
50a0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
50b0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
50c0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
50d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50e0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
50f0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
5100: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
5110: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
5120: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5130: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5140: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5150: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5160: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5170: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5180: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5190: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
51a0: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
51b0: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
51c0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
51d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
51e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
51f0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
5200: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
5210: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
5220: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5230: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5240: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5250: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5260: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5270: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5280: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5290: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
52a0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
52b0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
52c0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
52d0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
52e0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
52f0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
5300: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5310: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5320: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5330: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5340: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5350: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5360: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5370: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5380: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5390: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
53a0: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
53b0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
53c0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
53d0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
53e0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
53f0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
5400: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5410: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5420: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5430: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5440: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5450: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5460: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5470: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5480: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5490: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
54a0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
54b0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54c0: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
54d0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
54e0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
54f0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
5500: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5510: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5520: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5530: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5540: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5550: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5560: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5570: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5580: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
55a0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
55b0: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
55c0: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
55d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
55e0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
55f0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5600: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5610: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5620: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5630: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5640: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5650: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5670: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5680: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5690: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
56a0: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
56b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
56c0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
56d0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
56e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
56f0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
5700: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5710: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5720: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5730: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5740: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5750: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5760: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5770: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5790: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
57a0: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
57b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
57c0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
57d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
57e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
5800: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5810: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5830: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5840: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5850: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5860: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5870: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5880: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5890: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
58a0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
58b0: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
58c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
58d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
58e0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
58f0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5900: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5910: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5920: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5930: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5940: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5950: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5960: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5970: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5980: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5990: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
59a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
59b0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
59c0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
59d0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
59e0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
59f0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
5a00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a10: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5a20: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5a30: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5a40: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5a50: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5a60: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5a70: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5a80: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5a90: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5aa0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5ab0: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5ac0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5ae0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5af0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5b00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b30: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5b40: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5b50: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5b60: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5b70: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5b80: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5b90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5ba0: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5bb0: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5bc0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5bd0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5be0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5bf0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5c00: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5c10: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5c40: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5c60: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5c80: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5ca0: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5cc0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5cd0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5ce0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5cf0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5d00: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5d10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d20: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5d30: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5d40: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5d50: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5d60: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5d70: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5d80: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5d90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5da0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5db0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5dc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5dd0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5de0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5df0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5e00: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5e10: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e20: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
5e30: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5e40: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
5e50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5e60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5e70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5e80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5e90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
5ea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5eb0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
5ec0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
5ed0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
5ee0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
5ef0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5f00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5f10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5f20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5f30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5f40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5f50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5f60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5f70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5f80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5f90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
5fa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
5fc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
5fd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
5ff0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6000: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6010: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6020: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6030: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6040: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6050: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6060: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6070: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6080: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6090: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
60a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60b0: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
60c0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
60d0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
60e0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
60f0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
6100: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6110: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6120: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6130: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6140: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6150: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6160: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6170: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6180: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6190: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
61a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
61b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61c0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
61d0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
61e0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
61f0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
6200: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6210: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6220: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6230: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6240: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6250: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6260: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6270: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6280: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6290: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
62a0: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
62b0: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
62c0: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
62d0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
62e0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
62f0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
6300: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6310: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6320: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6330: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6340: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6350: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6360: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6370: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6380: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6390: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
63a0: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
63b0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
63c0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
63d0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
63e0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
63f0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6400: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6410: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6420: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6430: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6440: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6450: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6460: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6470: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6480: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6490: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
64a0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
64b0: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
64c0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
64d0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
64e0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
64f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6510: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6520: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6530: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6540: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6550: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6560: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6570: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6580: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6590: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
65a0: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
65b0: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
65c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
65d0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
65e0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
65f0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
6600: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6610: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6620: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6630: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6640: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6650: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6660: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6670: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6680: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6690: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
66a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
66b0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
66c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
66d0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
66e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
66f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6700: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6710: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6720: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6730: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6740: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6750: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6760: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6770: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6780: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6790: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
67a0: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
67b0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
67c0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
67d0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
67e0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
67f0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
6800: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6810: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6820: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6830: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6850: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6860: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6870: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6880: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6890: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
68a0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
68b0: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
68c0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
68d0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
68e0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
68f0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
6900: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6910: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6920: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6930: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6940: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6950: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6960: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6970: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6980: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6990: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
69a0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
69b0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
69c0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
69d0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
69e0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
69f0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
6a00: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6a10: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6a20: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6a30: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6a40: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6a60: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6a70: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6a80: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6a90: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6aa0: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6ab0: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6ac0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ad0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6ae0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6af0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6b00: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6b10: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6b20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6b30: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6b40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b50: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6b60: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6b70: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6b80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6b90: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6ba0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6bb0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6bc0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6bd0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6be0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6bf0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6c00: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6c10: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6c20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6c30: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6c40: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6c50: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6c60: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6c70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c80: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6c90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6ca0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6cb0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cc0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6cd0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6ce0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6cf0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6d00: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6d10: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6d20: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6d30: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6d40: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6d50: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6d60: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6d70: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6d80: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6d90: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6da0: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6db0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6dc0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6dd0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6de0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6df0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6e00: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6e10: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6e20: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
6e30: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
6e40: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
6e50: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
6e60: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6e70: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
6e80: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6e90: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6ea0: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6eb0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
6ec0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6ed0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
6ee0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
6ef0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
6f00: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
6f10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
6f20: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
6f30: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
6f40: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
6f50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6f60: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
6f70: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
6f80: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
6f90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6fa0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
6fb0: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
6fc0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
6fd0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
6fe0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
6ff0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
7000: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7010: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7020: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7030: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7040: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7050: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7060: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7070: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7080: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7090: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
70a0: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
70b0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
70c0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
70d0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
70e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
70f0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
7100: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7110: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7120: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7130: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7140: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7150: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7160: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7170: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7180: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7190: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
71a0: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
71b0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
71c0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
71d0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
71e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
71f0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
7200: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7210: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7220: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7230: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7240: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7250: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7260: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7270: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7280: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7290: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
72a0: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
72b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
72c0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
72d0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
72e0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
72f0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
7300: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7310: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7320: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7330: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7340: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7350: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7360: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7370: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7380: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7390: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
73a0: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
73b0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
73c0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
73d0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
73e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
73f0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
7400: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7410: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7420: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7430: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7440: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7450: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7460: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7470: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7480: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7490: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
74a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
74d0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
74e0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
74f0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
7500: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7510: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7520: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7530: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7540: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7550: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7580: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7590: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
75a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
75b0: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
75c0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
75d0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
75e0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
75f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7600: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7610: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7620: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7630: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7640: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7650: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7660: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7670: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7680: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7690: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
76a0: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
76b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
76c0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
76d0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
76e0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
76f0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
7700: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7710: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7720: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7730: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7740: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7750: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7760: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7770: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7780: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7790: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
77a0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
77b0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
77c0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
77d0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
77e0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
77f0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
7800: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
7810: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7820: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
7830: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
7840: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
7850: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
7860: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7870: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
7880: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
7890: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
78a0: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
78b0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
78c0: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
78d0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
78e0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
78f0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
7900: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
7910: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7920: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
7930: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
7940: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7950: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7960: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7970: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7980: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7990: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
79a0: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
79b0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
79c0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
79d0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
79e0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
79f0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
7a00: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
7a10: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7a20: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7a30: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
7a40: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
7a50: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
7a60: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7a70: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
7a80: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
7a90: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
7aa0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
7ab0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
7ac0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
7ad0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
7ae0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
7af0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
7b00: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
7b10: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
7b20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
7b30: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
7b40: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
7b50: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
7b60: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
7b70: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
7b80: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
7b90: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
7ba0: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
7bb0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
7bc0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
7bd0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7be0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7bf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
7c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c10: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
7c20: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7c30: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
7c40: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
7c50: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
7c60: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
7c70: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
7c80: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
7c90: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7ca0: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
7cb0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
7cc0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
7cd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
7ce0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7cf0: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
7d00: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
7d10: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7d20: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
7d30: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
7d40: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
7d50: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
7d60: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
7d70: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
7d80: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
7d90: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
7da0: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
7db0: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
7dc0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
7dd0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
7de0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
7df0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
7e10: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
7e20: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
7e30: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
7e40: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
7e50: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
7e60: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7e70: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
7e80: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
7e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7ea0: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
7eb0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
7ec0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
7ed0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
7ee0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7ef0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
7f00: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
7f10: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
7f20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
7f30: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
7f40: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
7f50: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
7f60: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
7f70: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
7f80: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
7f90: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
7fa0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
7fb0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
7fc0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
7fd0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
7fe0: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
7ff0: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
8000: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
8010: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
8020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8030: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
8040: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8050: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
8060: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
8070: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
8080: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
8090: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
80a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
80b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
80c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
80d0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
80e0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
80f0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8100: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8110: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
8120: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
8130: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
8140: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
8150: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
8160: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
8170: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
8180: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
8190: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
81a0: 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  h = 0;.  pPager-
81b0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nRef = 0;.}../*
81c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
81d0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
81e0: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
81f0: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
8200: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
8210: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
8220: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
8230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8240: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
8250: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
8260: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
8270: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
8280: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
8290: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
82a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
82b0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
82c0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
82d0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
82e0: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
82f0: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
8300: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
8310: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
8320: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
8330: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
8340: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
8350: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
8360: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
8370: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
8380: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
8390: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
83a0: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
83b0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
83c0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
83d0: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
83e0: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
83f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
8400: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
8410: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8420: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
8430: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
8440: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
8450: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
8460: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
8470: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
8480: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
8490: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
84a0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
84b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
84c0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
84d0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
84e0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
84f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8500: 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  ;.  int rc2 = SQ
8510: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
8520: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
8530: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8540: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
8550: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8560: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
8570: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
8580: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
8590: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
85a0: 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72  tOpen && !pPager
85b0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
85c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
85d0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
85e0: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
85f0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8600: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8620: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8630: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
8640: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63            && (rc
8650: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
8660: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
8670: 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , 0))==SQLITE_OK
8680: 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ){;.      sqlit
8690: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
86a0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
86b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
86c0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
86d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
86e0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
86f0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8700: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
8710: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
8720: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8730: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
8740: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8750: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8760: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8770: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8780: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8790: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
87a0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
87b0: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
87c0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
87d0: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
87e0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
87f0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
8800: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
8810: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
8820: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
8830: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
8840: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
8850: 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73       pPg->always
8860: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
8870: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
8880: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
8890: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
88a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
88b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
88c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
88d0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
88e0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
88f0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8900: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
8910: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
8920: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8930: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
8940: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
8950: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
8960: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
8970: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
8980: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8990: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
89a0: 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  c2 = sqlite3OsUn
89b0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
89c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
89d0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
89e0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
89f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
8a00: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
8a10: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
8a20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8a30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
8a40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
8a50: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8a60: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8a70: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
8a80: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8a90: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8aa0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8ab0: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
8ac0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8ad0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
8ae0: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8b00: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
8b10: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
8b20: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
8b30: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
8b40: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
8b50: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
8b60: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
8b70: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
8b80: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
8b90: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8ba0: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
8bb0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
8bc0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
8bd0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
8be0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
8bf0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
8c00: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
8c10: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
8c20: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
8c30: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
8c40: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
8c50: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
8c60: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
8c70: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
8c80: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
8c90: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
8ca0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
8cb0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
8cc0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
8cd0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
8ce0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
8cf0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
8d00: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
8d10: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
8d20: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
8d30: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
8d40: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
8d50: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
8d60: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
8d70: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
8d80: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
8d90: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
8da0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
8db0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
8dc0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
8dd0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
8de0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
8df0: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
8e00: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
8e10: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
8e20: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
8e30: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
8e40: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
8e50: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
8e60: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
8e70: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
8e80: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
8e90: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
8ea0: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
8eb0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
8ec0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
8ed0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
8ee0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
8ef0: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
8f00: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
8f10: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
8f20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
8f30: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8f40: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8f50: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8f60: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8f70: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8f80: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8f90: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
8fa0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
8fb0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
8fc0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
8fd0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
8fe0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
8ff0: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
9000: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
9010: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
9020: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9030: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
9040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
9050: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
9060: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
9070: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
9080: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
9090: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
90a0: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
90b0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
90c0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
90d0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
90e0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
90f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
9100: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
9110: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
9120: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
9130: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
9140: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
9150: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
9160: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
9170: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
9180: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
9190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91a0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
91b0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
91c0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
91d0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
91e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
91f0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
9200: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
9210: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
9240: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
9250: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
9260: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
9270: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9280: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
9290: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
92a0: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
92b0: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
92c0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
92d0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
92e0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
92f0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
9300: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
9310: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
9320: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9330: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
9340: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9350: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9360: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9370: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
9380: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
9390: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
93a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
93b0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
93c0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
93d0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
93e0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
93f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9400: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
9410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9420: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
9430: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
9440: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
9450: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
9460: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
9470: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
9480: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
9490: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
94a0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
94b0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
94c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
94d0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
94e0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
94f0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
9500: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
9510: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
9520: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
9530: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
9540: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
9550: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
9560: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
9570: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
9580: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
9590: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
95b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
95c0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
95d0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
95e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
95f0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
9600: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
9610: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9620: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9630: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9640: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9650: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9660: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9670: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
9680: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
9690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
96a0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
96b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
96c0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
96d0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
96e0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
96f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
9700: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9710: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
9720: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9730: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9740: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9750: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9760: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9770: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
9780: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9790: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
97a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
97b0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
97c0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
97d0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
97e0: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
97f0: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9800: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9810: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9820: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9830: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9840: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9850: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9860: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9870: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
9880: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9890: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
98a0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
98b0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
98c0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
98d0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
98e0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
98f0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9900: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9910: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9920: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9930: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9940: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9950: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9960: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9970: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
9980: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
9990: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
99a0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
99b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
99c0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
99d0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
99e0: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
99f0: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9a00: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9a10: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9a20: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9a30: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9a40: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9a50: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9a60: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9a70: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9a80: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9a90: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9aa0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9ab0: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9ac0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9ad0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9ae0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9af0: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9b00: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9b10: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9b20: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9b30: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9b40: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9b50: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9b60: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9b70: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9b80: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9b90: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9ba0: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9bb0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9bc0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9bd0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9be0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9bf0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9c00: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9c10: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 50 41  | pPg!=0 );.  PA
9c20: 47 45 52 54 52 41 43 45 33 28 22 50 4c 41 59 42  GERTRACE3("PLAYB
9c30: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
9c40: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
9c50: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9c60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9c70: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9c80: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9c90: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9ca0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9cb0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
9cc0: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9cd0: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
9ce0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
9cf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9d00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9d10: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9d20: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
9d30: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9d40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9d50: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
9d60: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
9d70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
9d80: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
9d90: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
9da0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
9db0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
9dc0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
9dd0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
9de0: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
9df0: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
9e00: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
9e10: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
9e20: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
9e30: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
9e40: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
9e50: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
9e60: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
9e70: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
9e80: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
9e90: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
9ea0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
9eb0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
9ec0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
9ed0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
9ee0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
9ef0: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
9f00: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
9f10: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
9f20: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
9f30: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
9f40: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9f50: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
9f60: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
9f70: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
9f80: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
9f90: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
9fa0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
9fb0: 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
9fc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9fd0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9fe0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
9ff0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a000: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a010: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a020: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
a030: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
a040: 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20 20 20 2f  pgno, 3);..    /
a050: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a060: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a070: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a080: 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75  Pager.iChangeCou
a090: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  nt */.    if( pg
a0a0: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  no==1 ){.      p
a0b0: 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
a0c0: 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
a0d0: 62 69 74 73 28 70 50 67 2c 20 32 34 29 3b 0a 20  bits(pPg, 24);. 
a0e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a0f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
a100: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
a110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a120: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a130: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
a140: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
a150: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
a160: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a170: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
a180: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
a190: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
a1a0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
a1b0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a1c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a1d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
a1e0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
a1f0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
a200: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a210: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
a220: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
a230: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
a240: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
a250: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a260: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
a270: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
a280: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
a290: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
a2a0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
a2b0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
a2c0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
a2d0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
a2e0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
a2f0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
a300: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
a310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a320: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
a330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
a340: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
a350: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
a360: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
a370: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
a380: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
a390: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
a3a0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
a3b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
a3c0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
a3d0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
a3e0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
a3f0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
a400: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
a410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
a420: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
a430: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
a440: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
a450: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
a460: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
a470: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
a480: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
a490: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
a4a0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a4b0: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
a4c0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
a4d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a4e0: 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20  master );.  if( 
a4f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a500: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a510: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a520: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a530: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a540: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a550: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a560: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a570: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a580: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a590: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a5a0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a5b0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a5c0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a5d0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a5e0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a5f0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a600: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a610: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a620: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a630: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a640: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a650: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a660: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a670: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a680: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a690: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a6a0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a6b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a6c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a6d0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a6e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a6f0: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a700: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a710: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a720: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a730: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a740: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a750: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a760: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a770: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a780: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a790: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a7a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a7b0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a7c0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a7d0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a7f0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a800: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a810: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a820: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a830: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a840: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a850: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a860: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a870: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a880: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a890: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a8a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a8b0: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a8c0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a8d0: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a8e0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a8f0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a900: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a910: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
a920: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72  QLITE_OK || jour
a930: 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  nal );.        i
a940: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
a960: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a980: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
a990: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
a9a0: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
a9b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a9c0: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
a9d0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
a9e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
aa00: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
aa10: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
aa20: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
aa30: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
aa40: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
aa50: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
aa60: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
aa70: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
aa80: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
aa90: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
aaa0: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
aab0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
aac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
aad0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
aae0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
aaf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ab00: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
ab10: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
ab20: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
ab30: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
ab40: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
ab50: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
ab60: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
ab70: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
ab80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
ab90: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
aba0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
abb0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
abc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
abd0: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
abe0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30  urn rc;.}..#if 0
abf0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
ac00: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
ac10: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
ac20: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
ac30: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ac40: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
ac50: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
ac60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
ac70: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
ac80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ac90: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
aca0: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
acb0: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
acc0: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
acd0: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
ace0: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
acf0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
ad00: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
ad10: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
ad20: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
ad30: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
ad40: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
ad50: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
ad60: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
ad70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ad80: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
ad90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ada0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
adb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
adc0: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
add0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
ade0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
adf0: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ll){.    char *z
ae00: 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Buf = pPager->pT
ae10: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
ae20: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
ae30: 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a  for one page */.
ae40: 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69      if( !pPg->di
ae50: 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
ae60: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
ae70: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
ae80: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
ae90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aea0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
aeb0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
aec0: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
aed0: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
aee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
aef0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
af00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
af10: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
af20: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
af30: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
af40: 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
af50: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
af60: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
af70: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
af80: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
af90: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
afa0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
afb0: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
afc0: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
afd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
afe0: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
aff0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
b000: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
b010: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
b020: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
b030: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
b040: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
b050: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
b060: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
b070: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
b080: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
b090: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
b0a0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
b0b0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
b0c0: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
b0d0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
b0e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
b0f0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
b100: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
b110: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
b120: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
b130: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
b140: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
b150: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
b160: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
b170: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
b180: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
b190: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
b1a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50  .#endif.  }.  pP
b1b0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
b1c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b1d0: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
b1e0: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
b1f0: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
b200: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
b210: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
b220: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
b230: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
b240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
b250: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
b260: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
b270: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
b280: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
b290: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b2a0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
b2b0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
b2c0: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
b2d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b2e0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
b2f0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
b300: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
b310: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
b320: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
b330: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b340: 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a  ze*(i64)nPage);.
b350: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
b360: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
b370: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
b380: 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
b390: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
b3a0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
b3b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3c0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
b3d0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
b3e0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
b3f0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
b400: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
b410: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
b420: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
b430: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
b440: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b450: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
b460: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
b470: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
b480: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
b490: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
b4a0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
b4b0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b4c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b4d0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
b4e0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
b4f0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
b500: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
b510: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
b520: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
b530: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
b540: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
b550: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
b560: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
b570: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b580: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b590: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
b5a0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
b5b0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
b5c0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
b5d0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
b5e0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
b5f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b600: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
b610: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
b620: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
b630: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
b640: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b650: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b660: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b670: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b680: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
b690: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
b6a0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
b6b0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
b6c0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
b6d0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
b6e0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
b6f0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
b700: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
b710: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
b720: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
b730: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
b740: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
b750: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
b760: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
b770: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
b780: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
b790: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
b7a0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
b7b0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
b7c0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
b7d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
b7e0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
b7f0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
b800: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
b810: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
b820: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
b830: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
b840: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
b850: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
b860: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
b870: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
b880: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
b890: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
b8a0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
b8b0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
b8c0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
b8d0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
b8e0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
b8f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
b900: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
b910: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
b920: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
b930: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
b940: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
b950: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
b960: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
b970: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
b980: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
b990: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
b9a0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
b9b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
b9c0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
b9d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b9e0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
b9f0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
ba00: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
ba10: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
ba20: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
ba30: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
ba40: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
ba50: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
ba60: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
ba70: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
ba80: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
ba90: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
baa0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
bab0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
bac0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
bad0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
bae0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
baf0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
bb00: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
bb10: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
bb20: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
bb30: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
bb40: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
bb50: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
bb60: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
bb70: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
bb80: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
bb90: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
bba0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
bbb0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
bbc0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
bbd0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
bbe0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
bbf0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
bc00: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
bc10: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
bc20: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
bc30: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
bc40: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
bc50: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
bc60: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
bc70: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
bc80: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
bc90: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
bca0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
bcb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
bcc0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
bcd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
bce0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
bcf0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
bd00: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
bd10: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
bd20: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
bd30: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
bd40: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
bd50: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
bd60: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
bd70: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
bd80: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
bd90: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
bda0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
bdb0: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
bdc0: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
bdd0: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
bde0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
bdf0: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
be00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
be10: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
be20: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
be30: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
be40: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
be50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
be60: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
be70: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
be80: 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a  isHot){.  i64 sz
be90: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
bea0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
beb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bec0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
bed0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
bee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bef0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
bf00: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
bf10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
bf20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
bf30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
bf40: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
bf50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bf60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
bf70: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
bf80: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
bf90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
bfa0: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
bfb0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
bfc0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
bfd0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
bfe0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
bff0: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
c000: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
c010: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
c020: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
c030: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
c040: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
c050: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
c060: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c070: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c080: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
c090: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
c0a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
c0b0: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
c0c0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
c0d0: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
c0e0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
c0f0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
c100: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c110: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
c120: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
c130: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
c140: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c150: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
c160: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
c170: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
c180: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
c190: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
c1a0: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
c1b0: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
c1c0: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
c1d0: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
c1e0: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
c1f0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
c200: 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20  d, &zMaster);.  
c210: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c220: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
c230: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
c240: 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73  | (zMaster && !s
c250: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
c260: 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a  ts(zMaster)) ){.
c270: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c280: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
c290: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
c2a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
c2b0: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
c2c0: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
c2d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
c2e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
c2f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
c300: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c310: 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lOff = 0;..  /* 
c320: 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
c330: 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
c340: 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c   the readJournal
c350: 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72  Hdr() call retur
c360: 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  ns.  ** SQLITE_D
c370: 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
c380: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
c390: 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
c3a0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
c3b0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c3c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c3d0: 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
c3e0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
c3f0: 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
c400: 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
c410: 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
c420: 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
c430: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
c440: 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
c450: 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
c460: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
c470: 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
c480: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
c490: 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
c4a0: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
c4b0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
c4c0: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
c4d0: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
c4e0: 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
c4f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c500: 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
c510: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
c520: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
c530: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
c550: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c560: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c570: 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
c580: 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
c590: 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
c5a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
c5b0: 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
c5c0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
c5d0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
c5e0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
c5f0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
c600: 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
c610: 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
c620: 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
c630: 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
c640: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
c650: 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
c660: 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
c670: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
c680: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
c690: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
c6a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
c6b0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c6c0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c6d0: 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
c6e0: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
c6f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
c700: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c710: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c720: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
c730: 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
c740: 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
c750: 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
c760: 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
c770: 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73 20  rocess. In this 
c780: 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f 66  case the rest of
c790: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c7a0: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20  e consists of.  
c7b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20    ** journalled 
c7c0: 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73 20  copies of pages 
c7d0: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
c7e0: 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  read back into t
c7f0: 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  he cache..    */
c800: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
c810: 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20 20   && !isHot ){.  
c820: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
c830: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
c840: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
c850: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c860: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c870: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
c880: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
c890: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
c8a0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
c8b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
c8c0: 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
c8d0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
c8e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
c8f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c900: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
c910: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
c920: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
c930: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
c940: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
c950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c960: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
c970: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
c980: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c990: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
c9a0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
c9b0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
c9c0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
c9d0: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
c9e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
c9f0: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
ca00: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
ca10: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
ca20: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
ca30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
ca40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ca50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
ca60: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
ca70: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
ca80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ca90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
caa0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
cab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cac0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cad0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
cae0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
caf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cb00: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
cb10: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
cb20: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
cb30: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
cb40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cb50: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
cb60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
cb70: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
cb80: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
cb90: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
cba0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
cbb0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
cbc0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
cbd0: 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
cbe0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
cbf0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
cc00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
cc10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
cc20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cc30: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
cc40: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
cc50: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
cc60: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
cc70: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
cc80: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
cc90: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
cca0: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
ccb0: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
ccc0: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
ccd0: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
cce0: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
ccf0: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
cd00: 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
cd10: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
cd20: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
cd30: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
cd40: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
cd50: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
cd60: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
cd70: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
cd80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cd90: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
cda0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cdb0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
cdc0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
cdd0: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
cde0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
cdf0: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
ce00: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
ce10: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
ce20: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
ce30: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
ce40: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
ce50: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
ce60: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
ce70: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
ce80: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ce90: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
cea0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
ceb0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
cec0: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
ced0: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
cee0: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
cef0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
cf00: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
cf10: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
cf20: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
cf30: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
cf40: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
cf50: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
cf60: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
cf70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
cf80: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
cf90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
cfa0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cfc0: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
cfd0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
cfe0: 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
cff0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
d000: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d010: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
d020: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d030: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d040: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
d050: 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
d060: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
d070: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
d080: 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
d090: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
d0a0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d0b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f  Pager->jfd, &os_
d0c0: 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  szJ);.    if( rc
d0d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
d0e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73  turn rc;.    ass
d0f0: 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a  ert( szJ==os_szJ
d100: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
d110: 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
d120: 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
d130: 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
d140: 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
d150: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
d160: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
d170: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d180: 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
d190: 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
d1a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
d1b0: 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
d1c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
d1d0: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
d1e0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
d1f0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
d200: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
d210: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
d220: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
d230: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
d240: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
d250: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
d260: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
d270: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
d280: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
d290: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
d2a0: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
d2b0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
d2c0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d2d0: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
d2e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d2f0: 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
d300: 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
d310: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
d320: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
d330: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
d340: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
d350: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
d360: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
d370: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
d380: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
d390: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
d3a0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
d3b0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
d3c0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
d3d0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
d3e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d3f0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
d400: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
d410: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
d420: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
d430: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
d440: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
d450: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
d460: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
d470: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
d480: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
d490: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
d4a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
d4b0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
d4c0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
d4d0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d4e0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d4f0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
d500: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
d510: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d520: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
d530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d540: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d550: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
d560: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
d570: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
d580: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d590: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
d5a0: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
d5b0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
d5c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
d5d0: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
d5e0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
d5f0: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
d600: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
d610: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d620: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
d630: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
d640: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
d650: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
d660: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
d670: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
d680: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
d690: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
d6a0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
d6b0: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
d6c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d6d0: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
d6e0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
d6f0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
d700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d710: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
d720: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
d730: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
d740: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d750: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d760: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
d770: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d780: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
d790: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
d7a0: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
d7b0: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
d7c0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d7d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
d7e0: 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
d7f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d800: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d810: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
d820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
d830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d840: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d850: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d860: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d870: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
d880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d890: 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75  f < szJ ){.    u
d8a0: 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20  32 nJRec;       
d8b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
d8c0: 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
d8d0: 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
d8e0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
d8f0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
d900: 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
d910: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
d920: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
d940: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d950: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
d960: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d970: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52     }.    if( nJR
d980: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
d990: 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  JRec = (szJ - pP
d9a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d9b0: 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67  ) / (pPager->pag
d9c0: 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a  eSize+8);.    }.
d9d0: 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d      for(i=nJRec-
d9e0: 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65  1; i>=0 && pPage
d9f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
da00: 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  szJ; i--){.     
da10: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
da20: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
da30: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
da40: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  d, 1);.      ass
da50: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
da60: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
da70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
da80: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
da90: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
daa0: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
dab0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
dac0: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
dad0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
dae0: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
daf0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
db00: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
db10: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
db20: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
db30: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
db40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
db50: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
db60: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
db70: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
db80: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
db90: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
dba0: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
dbb0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
dbc0: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
dbd0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
dbe0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
dbf0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
dc00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
dc10: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
dc20: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
dc30: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
dc40: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
dc50: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
dc60: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
dc70: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
dc80: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
dc90: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
dca0: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
dcb0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
dcc0: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
dcd0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
dce0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
dcf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
dd00: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
dd10: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
dd20: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
dd30: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
dd40: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
dd50: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
dd60: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
dd70: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
dd80: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
dd90: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
dda0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ddb0: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
ddc0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
ddd0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
dde0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
ddf0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
de00: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
de10: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
de20: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
de40: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
de50: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
de60: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
de70: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
de80: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
de90: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
dea0: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
deb0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
dec0: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
ded0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
dee0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
def0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
df00: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
df10: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
df20: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
df40: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
df50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
df60: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
df70: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
df80: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
df90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
dfa0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
dfb0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
dfc0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
dfd0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
dfe0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
dff0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
e000: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
e010: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
e020: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
e030: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
e050: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
e060: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
e070: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
e080: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
e090: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
e0a0: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
e0b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
e0c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
e0d0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
e0e0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
e0f0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
e100: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
e110: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
e120: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
e130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
e140: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
e150: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
e160: 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
e170: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
e180: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
e190: 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
e1a0: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
e1b0: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
e1c0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
e1d0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
e1e0: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
e1f0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
e200: 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20  ger->full_fsync 
e210: 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20  = full_fsync;.  
e220: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e230: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
e240: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
e250: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
e260: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
e270: 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
e280: 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
e290: 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
e2a0: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
e2b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
e2c0: 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
e2d0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
e2e0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
e2f0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
e300: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
e310: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
e320: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e330: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
e340: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
e350: 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
e360: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
e370: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
e380: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
e390: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
e3a0: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
e3b0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
e3c0: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
e3d0: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
e3e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
e3f0: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
e400: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
e410: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
e420: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
e430: 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 4f  3PagerOpentemp(O
e440: 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20  sFile **pFd){.  
e450: 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69  int cnt = 8;.  i
e460: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 46  nt rc;.  char zF
e470: 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ile[SQLITE_TEMPN
e480: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64  AME_SIZE];..#ifd
e490: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
e4a0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
e4b0: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
e4c0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
e4d0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
e4e0: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f  y */.#endif.  do
e4f0: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
e500: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
e510: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
e520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e530: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
e540: 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20  File, pFd, 1);. 
e550: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e560: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64  QLITE_OK || *pFd
e570: 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e   );.  }while( cn
e580: 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  t>0 && rc!=SQLIT
e590: 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
e5a0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65  TE_NOMEM );.  re
e5b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e5c0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
e5d0: 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
e5e0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
e5f0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
e600: 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
e610: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
e620: 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
e630: 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
e640: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
e650: 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
e660: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
e670: 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
e680: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
e690: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
e6a0: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
e6b0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
e6c0: 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
e6d0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
e6e0: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
e6f0: 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
e700: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
e710: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
e720: 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
e730: 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
e740: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
e750: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
e760: 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
e770: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
e780: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
e790: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
e7a0: 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
e7b0: 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
e7c0: 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
e7d0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
e7e0: 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
e7f0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
e800: 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
e810: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
e820: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e830: 4f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  Open(.  Pager **
e840: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
e850: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
e860: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
e870: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
e880: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
e890: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
e8a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
e8b0: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
e8c0: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
e8d0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
e8e0: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
e8f0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
e900: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
e930: 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
e940: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
e950: 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ager = 0;.  char
e960: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
e970: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  = 0;.  int nameL
e980: 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  en;  /* Compiler
e990: 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20   is wrong. This 
e9a0: 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
e9b0: 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65  lized before use
e9c0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
e9d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
e9e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e9f0: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
ea00: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
ea10: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
ea20: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
ea30: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
ea40: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
ea50: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
ea60: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
ea70: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
ea80: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
ea90: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
eaa0: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
eab0: 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20  E_SIZE];.#ifdef 
eac0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
ead0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
eae0: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
eaf0: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
eb00: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
eb10: 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
eb20: 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
eb30: 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
eb40: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
eb50: 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
eb60: 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
eb70: 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
eb80: 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
eb90: 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
eba0: 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
ebb0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
ebc0: 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
ebd0: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
ebe0: 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74  c can be set. It
ebf0: 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74   would be nice t
ec00: 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  o assert.  ** th
ec10: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
ec20: 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  lloc is non-zero
ec30: 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73 20  , but alas this 
ec40: 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73 65  breaks test case
ec50: 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  s .  ** written 
ec60: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61  to invoke the pa
ec70: 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ger directly..  
ec80: 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
ec90: 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
eca0: 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
ecb0: 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23  ssert( pTsd );.#
ecc0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 65 20 75  endif..  /* We u
ecd0: 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 6d  sed to test if m
ece0: 61 6c 6c 6f 63 28 29 20 68 61 64 20 61 6c 72 65  alloc() had alre
ecf0: 61 64 79 20 66 61 69 6c 65 64 20 62 65 66 6f 72  ady failed befor
ed00: 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 0a 20  e proceeding. . 
ed10: 20 2a 2a 20 42 75 74 20 74 68 65 20 77 61 79 20   ** But the way 
ed20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
ed30: 20 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65 20   used in SQLite 
ed40: 6d 65 61 6e 73 20 74 68 61 74 20 63 61 6e 20 6e  means that can n
ed50: 65 76 65 72 0a 20 20 2a 2a 20 68 61 70 70 65 6e  ever.  ** happen
ed60: 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69  . Furthermore, i
ed70: 66 20 74 68 65 20 6d 61 6c 6c 6f 63 2d 66 61 69  f the malloc-fai
ed80: 6c 65 64 20 66 6c 61 67 20 69 73 20 61 6c 72 65  led flag is alre
ed90: 61 64 79 20 73 65 74 2c 20 0a 20 20 2a 2a 20 65  ady set, .  ** e
eda0: 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
edb0: 6f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 29  o sqliteStrDup()
edc0: 20 6f 72 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   or sqliteMalloc
edd0: 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 0a 20 20  () below will.  
ede0: 2a 2a 20 66 61 69 6c 20 73 68 6f 72 74 6c 79 20  ** fail shortly 
edf0: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
ee00: 20 72 65 74 75 72 6e 65 64 20 61 6e 79 77 61 79   returned anyway
ee10: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
ee20: 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65  r = 0;..  /* Ope
ee30: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
ee40: 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61   and set zFullPa
ee50: 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20  thname to point 
ee60: 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20  at malloc()ed . 
ee70: 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61   ** memory conta
ee80: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65  ining the comple
ee90: 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65  te filename (i.e
eea0: 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  . including the 
eeb0: 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f  directory)..  */
eec0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
eed0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
eee0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
eef0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
ef00: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
ef10: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
ef20: 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
ef30: 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
ef40: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
ef50: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
ef60: 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  "");.    }else.#
ef70: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
ef80: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
ef90: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
efa0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
efb0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  e);.      if( zF
efc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
efd0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
efe0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
eff0: 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  te(zFullPathname
f000: 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79  , &fd, &readOnly
f010: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
f020: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f030: 20 7c 7c 20 66 64 20 29 3b 0a 20 20 20 20 20 20   || fd );.      
f040: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
f050: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f060: 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26  3PagerOpentemp(&
f070: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
f080: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
f090: 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65  Temp);.    zFile
f0a0: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
f0b0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
f0c0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
f0d0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
f0e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
f0f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f100: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
f110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f120: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   Allocate the Pa
f130: 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 20 41  ger structure. A
f140: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61  s part of the sa
f150: 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61  me allocation, a
f160: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61  llocate.  ** spa
f170: 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20  ce for the full 
f180: 70 61 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c  paths of the fil
f190: 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  e, directory and
f1a0: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28   journal .  ** (
f1b0: 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c  Pager.zFilename,
f1c0: 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72   Pager.zDirector
f1d0: 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  y and Pager.zJou
f1e0: 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  rnal)..  */.  if
f1f0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
f200: 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d  ){.    nameLen =
f210: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
f220: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67  hname);.    pPag
f230: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
f240: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
f250: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
f260: 20 33 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70   30 );.    if( p
f270: 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
f280: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f290: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f2a0: 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
f2b0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49  teMallocRaw(SQLI
f2c0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
f2d0: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SIZE);.    }.  }
f2e0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ...  /* If an er
f2f0: 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
f300: 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
f310: 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
f320: 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a  the memory .  **
f330: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
f340: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72  FullPathname, fr
f350: 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
f360: 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
f370: 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e   the .  ** file.
f380: 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
f390: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
f3a0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
f3b0: 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
f3c0: 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
f3d0: 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
f3e0: 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
f3f0: 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  || !zFullPathnam
f400: 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  e || !pPager->pT
f410: 6d 70 53 70 61 63 65 20 7c 7c 20 72 63 21 3d 53  mpSpace || rc!=S
f420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f430: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
f440: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
f450: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f460: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
f470: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
f480: 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
f490: 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
f4a0: 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20  OMEM:rc);.  }.. 
f4b0: 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50   PAGERTRACE3("OP
f4c0: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
f4d0: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a  EHANDLEID(fd), z
f4e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f4f0: 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
f500: 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
f510: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f520: 29 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ).  pPager->zFil
f530: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
f540: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
f550: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
f560: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
f570: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
f580: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
f590: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
f5a0: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
f5b0: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
f5c0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f5d0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f5e0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f5f0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
f600: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  FullPathname);..
f610: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
f620: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
f630: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
f640: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
f650: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
f660: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f670: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
f680: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
f690: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
f6a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
f6b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f6c0: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
f6d0: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
f6e0: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
f6f0: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
f700: 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  d;.  /* pPager->
f710: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
f720: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
f730: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
f740: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
f750: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
f760: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
f770: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
f780: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f790: 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
f7a0: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
f7b0: 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
f7c0: 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
f7d0: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f7e0: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
f7f0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
f800: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
f810: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
f820: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
f830: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
f840: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f850: 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
f860: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
f870: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f880: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
f890: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f8a0: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
f8b0: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
f8c0: 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f  UNLOCK==0 );.  /
f8d0: 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
f8e0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
f8f0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f900: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
f910: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
f920: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
f930: 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
f940: 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
f950: 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
f960: 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
f970: 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
f980: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
f990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
f9a0: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
f9b0: 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
f9c0: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
f9d0: 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
f9e0: 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
f9f0: 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
fa00: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
fa10: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
fa20: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
fa30: 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
fa40: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
fa50: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
fa60: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
fa70: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
fa80: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
fa90: 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50  nc?0:1);.  /* pP
faa0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
fab0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
fac0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
fad0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
fae0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
faf0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
fb00: 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
fb10: 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
fb20: 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62  assert(fd||memDb
fb30: 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
fb40: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
fb50: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
fb60: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
fb70: 66 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  fd);.  }.  /* pP
fb80: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fb90: 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
fba0: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
fbb0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
fbc0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
fbd0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
fbe0: 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
fbf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
fc00: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
fc10: 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20    pPager->pNext 
fc20: 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a  = pTsd->pPager;.
fc30: 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
fc40: 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a   pPager;.#endif.
fc50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fc60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
fc70: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
fc80: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
fc90: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fca0: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
fcb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
fcc0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
fcd0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
fce0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
fcf0: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
fd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fd10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
fd20: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
fd30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
fd40: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
fd50: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
fd60: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
fd70: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
fd80: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
fd90: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
fda0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
fdb0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
fdc0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
fdd0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
fde0: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
fdf0: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
fe00: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
fe10: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
fe20: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
fe30: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
fe40: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
fe50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
fe60: 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
fe70: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fe80: 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
fe90: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
fea0: 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
feb0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
fec0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
fed0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
fee0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
fef0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
ff00: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
ff10: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
ff20: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
ff30: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
ff40: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
ff50: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
ff60: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
ff70: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
ff80: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
ff90: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
ffa0: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
ffb0: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
ffc0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
ffd0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
ffe0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
fff0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
10000 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
10010 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
10020 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
10030 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
10040 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
10050 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
10060 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
10070 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
10080 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
10090 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
100a0 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
100b0 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
100c0 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
100d0 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
100e0 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
100f0 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
10100 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
10110 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
10120 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10130 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
10140 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10150 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
10160 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
10170 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
10180 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
10190 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
101a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
101b0 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  b && pPager->nRe
101c0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  f==0 ){.    page
101d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
101e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
101f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
10200 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  ;.    pPager->pT
10210 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10220 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  3ReallocOrFree(p
10230 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10240 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  , pageSize);.  }
10250 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
10260 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
10270 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
10280 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
10290 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
102a0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
102b0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
102c0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
102d0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
102e0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
102f0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
10300 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
10310 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
10320 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
10330 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
10340 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
10350 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
10360 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
10370 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
10380 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
10390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
103a0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
103b0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
103c0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
103d0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
103e0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
103f0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
10400 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
10410 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10420 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
10430 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
10440 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
10450 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10460 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
10470 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
10480 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10490 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
104a0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
104b0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
104c0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
104d0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
104e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
104f0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
10500 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10510 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
10520 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
10530 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
10540 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
10550 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
10560 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
10570 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
10580 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
10590 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
105a0 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
105b0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
105c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
105d0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
105e0 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
105f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
10600 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
10610 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
10620 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
10630 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
10640 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
10650 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
10660 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
10670 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
10680 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
10690 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
106a0 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
106b0 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
106c0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
106d0 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
106e0 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
106f0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
10700 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
10710 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
10720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
10730 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
10740 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
10750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
10760 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
10770 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
10780 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c  =0 ){.    disabl
10790 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
107a0 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
107b0 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
107c0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 65  r->fd, 0);.    e
107d0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
107e0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
107f0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
10800 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
10810 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
10820 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10830 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
10840 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  t, N);.    if( r
10850 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
10860 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
10870 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10880 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
10890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
108a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
108b0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
108c0 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
108d0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
108e0 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
108f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
10900 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
10910 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
10920 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
10930 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
10940 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
10950 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
10960 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
10970 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
10980 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
10990 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
109a0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
109b0 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
109c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
109d0 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
109e0 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
109f0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
10a00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
10a10 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
10a20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10a30 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
10a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10a50 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
10a60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
10a70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10a80 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
10a90 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
10aa0 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
10ab0 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
10ac0 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
10ad0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10ae0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
10af0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
10b00 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
10b10 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
10b20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10b30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
10b40 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
10b50 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
10b60 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
10b70 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
10b80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
10ba0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
10bb0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
10bc0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10bd0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
10be0 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
10bf0 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
10c00 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
10c10 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n++;.  }.  retur
10c20 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  n n;.}...#ifndef
10c30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10c40 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ORYDB./*.** Clea
10c50 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
10c60 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
10c70 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
10c80 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
10c90 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
10ca0 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
10cb0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
10cc0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
10cd0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
10ce0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
10cf0 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
10d00 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
10d10 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
10d20 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
10d30 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
10d40 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
10d50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ager*);../*.** U
10d60 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
10d70 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
10d80 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
10d90 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
10da0 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
10db0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
10dc0 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
10dd0 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
10de0 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
10df0 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
10e00 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
10e10 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
10e20 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
10e30 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
10e40 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
10e50 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
10e60 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
10e70 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
10e80 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
10e90 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
10ea0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
10eb0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
10ec0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10ed0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
10ee0 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
10ef0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Hash==0 );.    r
10f00 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10f10 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
10f20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
10f30 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
10f40 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
10f50 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
10f60 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
10f70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10f80 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67  r->aHash[pPg->pg
10f90 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
10fa0 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a  ash-1)]!=pPg );.
10fb0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
10fc0 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
10fd0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
10fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10ff0 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
11000 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
11010 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1);.    pPager->
11020 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
11030 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
11040 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
11050 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
11060 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
11070 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  , pPager));.  }.
11080 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
11090 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
110a0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
110b0 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
110c0 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
110d0 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
110e0 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
110f0 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
11100 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
11110 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
11120 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
11130 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
11140 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
11150 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
11160 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
11170 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
11180 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
11190 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
111a0 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
111b0 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
111c0 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
111d0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
111e0 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
111f0 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
11200 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
11210 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
11220 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
11230 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
11240 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11250 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
11260 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
11270 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
11280 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
11290 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
112a0 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
112b0 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
112c0 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
112d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
112e0 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
112f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
11300 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
11310 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
11320 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
11330 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
11340 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
11350 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
11370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
11380 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
11390 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
113a0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
113b0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
113c0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
113d0 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
113e0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
113f0 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
11400 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
11410 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
11420 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
11430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
11440 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  d to truncate th
11450 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64  e cache when a d
11460 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72  atabase.** is tr
11470 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66  uncated.  Drop f
11480 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c  rom the cache al
11490 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
114a0 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  no is.** larger 
114b0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
114c0 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
114d0 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  erenced..**.** R
114e0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
114f0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
11500 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
11510 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  eroed..**.** Act
11520 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f  ually, at the po
11530 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
11540 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77   is called, it w
11550 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72  ould be.** an er
11560 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65  ror to have a re
11570 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20  ferenced page.  
11580 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  But rather than 
11590 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70  delete.** that p
115a0 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65  age and guarante
115b0 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73  e a subsequent s
115c0 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d  egfault, it seem
115d0 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a  s better.** to z
115e0 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20  ero it and hope 
115f0 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75  that we error ou
11600 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61  t sanely..*/.sta
11610 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
11620 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
11630 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11640 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
11650 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
11660 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
11670 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
11680 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
11690 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
116a0 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
116b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
116c0 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
116d0 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
116e0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
116f0 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
11700 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
11710 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
11720 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
11730 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
11740 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
11750 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
11770 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
11780 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
11790 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
117a0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
117b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
117c0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
117d0 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
117e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
117f0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
11800 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
11810 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
11820 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
11830 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
11840 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
11850 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
11860 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
11870 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
11880 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
11890 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
118a0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
118b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
118c0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
118d0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
118e0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
118f0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
11900 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
11910 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
11920 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
11930 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
11940 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
11950 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
11960 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11970 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
11980 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
11990 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
119a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
119b0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
119c0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
119d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
119e0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
119f0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
11a00 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
11a10 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
11a20 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
11a30 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
11a40 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
11a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11a60 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11a70 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
11a80 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
11a90 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
11aa0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
11ab0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
11ac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
11ad0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
11ae0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11af0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
11b00 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
11b10 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11b20 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
11b30 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
11b40 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
11b50 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
11b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
11b80 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
11b90 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
11ba0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
11bb0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
11bc0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
11bd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
11bf0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
11c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11c10 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
11c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11c30 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
11c40 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11c50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
11c60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11c70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11c80 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
11c90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11ca0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11cb0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11cc0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11cd0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
11ce0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
11cf0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
11d00 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
11d10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
11d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11d30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
11d40 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
11d50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11d60 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
11d70 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
11d80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
11d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11da0 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f   }.  rc = syncJo
11db0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
11dc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11dd0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
11de0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
11df0 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
11e00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
11e10 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
11e20 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  cating. */.  rc 
11e30 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
11e40 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
11e50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
11e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11e70 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11e80 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
11e90 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
11ea0 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
11eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11ec0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
11ed0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
11ee0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
11ef0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
11f00 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
11f10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
11f20 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
11f30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11f40 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
11f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
11f60 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
11f70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
11f80 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
11f90 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
11fa0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
11fb0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
11fc0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
11fd0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
11fe0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
11ff0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
12000 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
12010 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
12020 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
12030 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
12040 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
12050 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
12060 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
12070 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
12080 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
12090 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
120a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
120b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
120c0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
120d0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
120e0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
120f0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
12100 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
12110 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
12120 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
12130 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12140 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12150 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
12160 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
12170 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
12180 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
12190 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
121a0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
121b0 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
121c0 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
121d0 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
121e0 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
121f0 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
12200 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
12210 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
12220 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
12230 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
12240 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
12250 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
12260 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
12270 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68  e set..  */.  Th
12280 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
12290 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
122a0 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
122b0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
122c0 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64  rt( pTsd && pTsd
122d0 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64  ->nAlloc );.#end
122e0 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
122f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12300 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
12310 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
12320 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
12330 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
12340 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12350 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
12360 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
12370 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
12380 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12390 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
123a0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
123b0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
123c0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
123d0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
123e0 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
123f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
12400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12410 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
12420 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
12430 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12440 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
12450 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12460 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
12470 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
12480 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
12490 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
124a0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
124b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
124c0 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
124d0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
124e0 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
124f0 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
12500 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
12510 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
12520 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
12530 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
12540 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
12550 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
12560 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
12570 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
12580 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12590 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
125a0 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  GEMENT.  /* Remo
125b0 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f  ve the pager fro
125c0 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  m the linked lis
125d0 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72  t of pagers star
125e0 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68  ting at .  ** Th
125f0 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20  readData.pPager 
12600 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
12610 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e  ment is enabled.
12620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12630 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
12640 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
12650 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
12660 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
12670 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
12680 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
12690 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
126a0 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
126b0 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
126c0 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e  xt){}.    pTmp->
126d0 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
126e0 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  pNext;.  }.#endi
126f0 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  f.  sqliteFree(p
12700 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
12710 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12720 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
12730 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12740 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
12750 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12760 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
12770 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
12780 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
12790 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
127a0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
127b0 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
127c0 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
127d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
127e0 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
127f0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
12800 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12810 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
12820 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
12830 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12840 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
12850 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
12860 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
12870 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
12880 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
12890 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
128a0 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
128b0 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
128c0 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
128d0 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
128e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
128f0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
12900 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
12910 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
12920 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
12930 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
12940 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
12950 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
12960 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
12970 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12980 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12990 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
129a0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
129b0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
129c0 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
129d0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
129e0 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
129f0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12a00 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
12a10 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12a20 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
12a30 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
12a40 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
12a50 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
12a60 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
12a70 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
12a80 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12a90 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12aa0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12ab0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12ac0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ae0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12af0 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12b00 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12b10 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
12b20 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12b30 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
12b40 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
12b50 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
12b60 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12b70 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
12b80 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12b90 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12ba0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12bb0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12bc0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12bd0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12be0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12bf0 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12c00 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
12c10 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12c20 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
12c30 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
12c40 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
12c50 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
12c60 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
12c70 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
12c80 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12c90 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12ca0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12cb0 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12cc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12cd0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12ce0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12cf0 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12d00 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
12d10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
12d20 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
12d30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12d40 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
12d50 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  ){.  page_ref(pP
12d60 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
12d70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12d80 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12d90 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
12da0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
12db0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
12dc0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
12dd0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
12de0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
12df0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
12e00 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
12e10 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
12e20 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
12e30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12e40 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
12e50 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
12e60 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
12e70 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
12e80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12e90 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
12ea0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
12eb0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
12ec0 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
12ed0 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
12ee0 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
12ef0 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
12f00 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
12f10 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
12f20 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
12f30 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
12f40 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
12f50 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
12f60 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
12f70 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12f80 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
12f90 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
12fa0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
12fb0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
12fc0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
12fd0 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
12fe0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
12ff0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13000 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
13010 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
13020 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
13030 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
13040 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
13050 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
13060 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
13070 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13080 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
13090 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
130a0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
130b0 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
130c0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
130d0 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
130e0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
130f0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
13100 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
13110 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13120 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
13130 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
13140 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
13150 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
13160 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
13170 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
13180 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
13190 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
131a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
131b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
131c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
131d0 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
131e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
131f0 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
13200 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
13210 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
13220 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
13230 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
13240 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
13250 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
13260 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
13270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13280 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
13290 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
132a0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
132b0 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
132c0 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
132d0 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
132e0 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
132f0 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
13300 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
13310 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
13320 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
13330 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
13340 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
13350 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
13360 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
13370 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
13380 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
13390 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
133a0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
133b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
133c0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
133d0 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
133e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
133f0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13400 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
13410 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13420 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13430 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13440 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13450 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
13460 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13470 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
13480 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
13490 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
134a0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
134b0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
134c0 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
134d0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
134e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
134f0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
13500 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
13510 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
13520 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
13530 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
13540 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
13550 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
13560 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
13570 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
13580 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
13590 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
135a0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
135b0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
135c0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
135d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
135e0 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
135f0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
13600 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
13610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
13620 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
13630 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13640 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13650 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
13660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13680 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
13690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
136a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
136b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
136c0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
136d0 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
136e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
136f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54   rc;.        IOT
13700 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
13710 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
13720 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
13730 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13740 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
13750 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c  (aJournalMagic),
13760 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63 20   4)).        rc 
13770 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
13780 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13790 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
137a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
137b0 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
137c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
137d0 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
137e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
137f0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
13800 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41        }.      PA
13820 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
13830 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
13840 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
13850 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
13860 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c  E(("JSYNC %d\n",
13870 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13880 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
13890 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
138a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
138b0 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
138c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
138d0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
138e0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
138f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
13900 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
13910 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
13920 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
13930 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
13940 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
13950 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
13960 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
13970 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
13980 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
13990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
139a0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
139b0 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
139c0 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
139d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
139e0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
139f0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
13a00 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
13a10 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
13a20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
13a30 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
13a40 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
13a50 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
13a60 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
13a70 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
13a80 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
13a90 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
13aa0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
13ab0 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
13ac0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
13ad0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
13ae0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13af0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
13b00 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
13b10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13b20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13b30 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
13b40 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
13b50 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
13b60 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
13b70 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
13b80 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
13b90 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
13ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
13bb0 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
13bc0 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
13bd0 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
13be0 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
13bf0 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
13c00 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
13c10 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
13c20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
13c30 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
13c40 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
13c50 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
13c60 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
13c70 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
13c80 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
13c90 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
13ca0 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
13cb0 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
13cc0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
13cd0 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
13ce0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13cf0 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
13d00 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
13d10 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13d20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
13d30 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13d40 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
13d50 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
13d60 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
13d70 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
13d80 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
13d90 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
13da0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
13db0 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
13dc0 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
13dd0 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
13de0 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
13df0 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
13e00 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13e10 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66  ET_ALLOC 25.#def
13e20 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
13e30 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65  T       25.#ifde
13e40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
13e50 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
13e60 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20  r_n_sort_bucket 
13e70 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f  = 0;.  #undef N_
13e80 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64  SORT_BUCKET.  #d
13e90 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13ea0 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65  KET \.   (sqlite
13eb0 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
13ec0 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61  ucket?sqlite3_pa
13ed0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
13ee0 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  t:N_SORT_BUCKET_
13ef0 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74  ALLOC).#endif.st
13f00 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
13f10 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
13f20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
13f30 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  a[N_SORT_BUCKET_
13f40 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e  ALLOC], *p;.  in
13f50 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c  t i;.  memset(a,
13f60 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a   0, sizeof(a));.
13f70 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a    while( pIn ){.
13f80 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20      p = pIn;.   
13f90 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79   pIn = p->pDirty
13fa0 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
13fb0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
13fc0 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
13fd0 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  T-1; i++){.     
13fe0 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a   if( a[i]==0 ){.
13ff0 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70          a[i] = p
14000 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14010 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14020 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f        p = merge_
14030 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
14040 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  );.        a[i] 
14050 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14060 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f   }.    if( i==N_
14070 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b  SORT_BUCKET-1 ){
14080 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61  .      /* Covera
14090 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c  ge: To get here,
140a0 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62   there need to b
140b0 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b  e 2^(N_SORT_BUCK
140c0 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c  ET) .      ** el
140d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
140e0 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69  put list. This i
140f0 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
14100 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20  impractical..   
14110 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68     ** Testing th
14120 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70  is line is the p
14130 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76  oint of global v
14140 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
14150 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
14160 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20  _sort_bucket..  
14170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69      */.      a[i
14180 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  ] = merge_pageli
14190 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
141a0 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30   }.  }.  p = a[0
141b0 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
141c0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69  N_SORT_BUCKET; i
141d0 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72  ++){.    p = mer
141e0 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61  ge_pagelist(p, a
141f0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
14200 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
14210 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
14220 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
14230 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
14240 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
14250 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
14260 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
14270 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
14280 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
14290 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
142a0 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
142b0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
142c0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
142d0 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
142e0 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
142f0 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
14300 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14310 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
14320 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
14330 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
14340 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
14350 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
14360 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
14370 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
14380 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14390 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
143a0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
143b0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
143c0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
143d0 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
143e0 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
143f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
14400 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
14410 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
14420 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
14430 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
14440 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
14450 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14460 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
14470 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
14480 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
14490 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
144a0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
144b0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
144c0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
144d0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
144e0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
144f0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
14500 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
14510 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
14520 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
14530 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
14540 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
14550 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
14560 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
14570 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
14580 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
14590 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
145a0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
145b0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
145c0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
145d0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
145e0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
145f0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
14600 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
14610 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
14620 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
14630 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
14640 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
14650 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
14660 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
14670 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
14680 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
14690 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
146a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
146b0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
146c0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
146d0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
146e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
146f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14700 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
14710 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
14720 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  t);.  while( pLi
14730 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
14740 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
14750 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14760 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
14770 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
14780 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
14790 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
147a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
147b0 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
147c0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
147d0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
147e0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
147f0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
14800 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
14810 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
14820 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
14830 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73  erTruncate() was
14840 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
14850 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
14860 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
14870 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
14880 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
14890 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
148a0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
148b0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
148c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
148d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
148e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Size ){.      ch
148f0 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
14900 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
14910 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
14920 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
14930 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
14940 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
14950 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14960 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14970 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49  ->pgno);.      I
14980 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14990 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
149a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20   pList->pgno)). 
149b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
149c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
149d0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
149e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
149f0 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70       TEST_INCR(p
14a00 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
14a10 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
14a20 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
14a30 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
14a40 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
14a50 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
14a60 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
14a70 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65  >pgno);.    }.#e
14a80 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20  ndif.    if( rc 
14a90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14aa0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20   pList->dirty = 
14ab0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
14ac0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
14ad0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
14ae0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
14af0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
14b00 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
14b10 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
14b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
14b40 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
14b50 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
14b60 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
14b70 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14b80 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
14b90 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
14ba0 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
14bb0 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
14bc0 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
14bd0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
14be0 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
14bf0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
14c00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14c10 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
14c20 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pDirty;.}../*.*
14c30 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
14c40 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
14c50 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
14c60 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
14c70 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
14c80 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
14c90 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
14ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
14cb0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
14cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14cd0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
14ce0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
14cf0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
14d00 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
14d10 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
14d20 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
14d30 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
14d40 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
14d50 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
14d60 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
14d70 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
14d80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14d90 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
14da0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
14db0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
14dc0 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
14dd0 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
14de0 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  al) ){.    retur
14df0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
14e00 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
14e10 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
14e20 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74  ->fd) ){.    ret
14e30 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
14e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
14e50 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
14e60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14e70 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14e80 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
14e90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
14ea0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
14eb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
14ec0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
14ed0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
14ee0 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
14ef0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
14f00 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
14f10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
14f20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
14f30 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
14f40 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
14f50 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  he pPager->errCo
14f60 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  de variable..*/.
14f70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
14f80 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
14f90 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
14fa0 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
14fb0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
14fc0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
14fd0 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b   assert(!MEMDB);
14fe0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
14ff0 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
15000 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
15010 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
15020 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
15030 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
15040 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
15050 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
15060 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
15070 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  ynced;..  /* If 
15080 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
15090 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
150a0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
150b0 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f  n fsync().  ** o
150c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
150d0 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
150e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
150f0 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20   This is a.  ** 
15100 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
15110 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
15120 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
15130 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
15140 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62  .  ** it can't b
15150 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20  e helped..  */. 
15160 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70   if( pPg==0 && p
15170 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26  Pager->pFirst &&
15180 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44   syncOk && !MEMD
15190 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  B){.    int rc =
151a0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
151b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
151c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
151d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
151e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
151f0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
15200 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
15210 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
15220 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
15230 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
15240 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
15250 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
15260 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
15270 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
15280 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  al.      ** head
15290 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
152a0 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
152b0 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
152c0 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  t have.      ** 
152d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
152e0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
152f0 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
15300 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20  e header is.    
15310 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
15320 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
15330 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
15340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
15350 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
15360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
15380 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  > 0 );.      ass
15390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
153a0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
153b0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
153c0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
153d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
153e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
153f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15400 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70     }.    pPg = p
15410 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
15420 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
15430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
15450 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
15460 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  f==0 );..  /* Wr
15470 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
15480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15490 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
154a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
154b0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69  ->dirty ){.    i
154c0 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
154d0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
154e0 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43  ==0 );.    makeC
154f0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
15500 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
15510 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
15520 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
15530 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
15540 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66  t( pPg );.    if
15550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15560 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15570 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
15580 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
15590 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
155a0 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
155b0 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
155c0 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
155d0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
155e0 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
155f0 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
15600 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
15610 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
15620 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
15630 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
15640 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
15650 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
15660 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
15670 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
15680 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
15690 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
156a0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
156b0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
156c0 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
156d0 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
156e0 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
156f0 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
15700 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
15710 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
15720 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
15730 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
15740 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
15750 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
15760 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
15770 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
15780 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
15790 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
157a0 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
157b0 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
157c0 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
157d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
157e0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
157f0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
15800 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
15810 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
15820 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
15830 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
15840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
15850 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
15860 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
15870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
15890 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
158a0 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
158b0 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
158c0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
158d0 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
158e0 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
158f0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
15900 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
15910 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
15920 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
15930 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
15940 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
15950 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
15960 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
15970 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
15980 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
15990 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
159a0 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
159b0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
159c0 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
159d0 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
159e0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
159f0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
15a00 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
15a10 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
15a20 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
15a30 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
15a40 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
15a50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
15a60 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
15a70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15a80 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e  ReleaseMemory(in
15a90 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74  t nReq){.  const
15aa0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
15ab0 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
15ac0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
15ad0 29 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  );.  int nReleas
15ae0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ed = 0;.  int i;
15af0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68  ..  /* If the th
15b00 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  e global mutex i
15b10 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62  s held, this sub
15b20 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20  routine becomes 
15b30 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72  a.  ** o-op; zer
15b40 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  o bytes of memor
15b50 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68  y are freed.  Th
15b60 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20  is is because.  
15b70 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** some of the c
15b80 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ode invoked by t
15b90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
15ba0 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74   also.  ** try t
15bb0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  o obtain the mut
15bc0 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ex, resulting in
15bd0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a   a deadlock..  *
15be0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  /.  if( sqlite3O
15bf0 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20  sInMutex(0) ){. 
15c00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15c10 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74  ..  /* Outermost
15c20 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61   loop runs for a
15c30 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61  t most two itera
15c40 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65  tions. First ite
15c50 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74  ration we.  ** t
15c60 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72  ry to find memor
15c70 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  y that can be re
15c80 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63  leased without c
15c90 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20  alling fsync(). 
15ca0 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72  Second.  ** iter
15cb0 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c  ation (which onl
15cc0 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69  y runs if the fi
15cd0 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72  rst failed to fr
15ce0 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66  ee nReq bytes of
15cf0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73  .  ** memory) is
15d00 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61   permitted to ca
15d10 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73  ll fsync(). This
15d20 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75   is of course mu
15d30 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78  ch more .  ** ex
15d40 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  pensive..  */.  
15d50 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69  for(i=0; i<=1; i
15d60 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  ++){..    /* Loo
15d70 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  p through all th
15d80 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20  e SQLite pagers 
15d90 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75  opened by the cu
15da0 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f  rrent thread. */
15db0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
15dc0 65 72 20 3d 20 70 54 73 64 72 6f 2d 3e 70 50 61  er = pTsdro->pPa
15dd0 67 65 72 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20  ger;.    for( ; 
15de0 70 50 61 67 65 72 20 26 26 20 28 6e 52 65 71 3c  pPager && (nReq<
15df0 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e  0 || nReleased<n
15e00 52 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50 61  Req); pPager=pPa
15e10 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
15e20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
15e30 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
15e40 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
15e50 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
15e60 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
15e70 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61    /* For each pa
15e80 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65  ger, try to free
15e90 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61   as many pages a
15ea0 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68  s possible (with
15eb0 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  out .      ** ca
15ec0 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66  lling fsync() if
15ed0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15ee0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
15ef0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20  the outermost . 
15f00 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20       ** loop).. 
15f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
15f20 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
15f30 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79  (rc = pager_recy
15f40 63 6c 65 28 70 50 61 67 65 72 2c 20 69 2c 20 26  cle(pPager, i, &
15f50 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a  pPg)) && pPg) {.
15f60 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65          /* We've
15f70 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f   found a page to
15f80 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70   free. At this p
15f90 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61  oint the page ha
15fa0 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  s been .        
15fb0 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ** removed from 
15fc0 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61  the page hash-ta
15fd0 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61  ble, free-list a
15fe0 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a  nd synced-list .
15ff0 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72          ** (pFir
16000 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73  stSynced). It is
16010 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c   still in the al
16020 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c  l pages (pAll) l
16030 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  ist. .        **
16040 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   Remove it from 
16050 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65  this list before
16060 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20   freeing..      
16070 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16080 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20  Todo: Check the 
16090 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74  Pager.pStmt list
160a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
160b0 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20  is is Ok. It .  
160c0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
160d0 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20  y is though..   
160e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
160f0 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20  PgHdr *pTmp;.   
16100 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
16110 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
16120 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
16130 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
16140 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50       if( pPg==pP
16150 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
16160 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16170 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
16180 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
16190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
161a0 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72  for( pTmp=pPager
161b0 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
161c0 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
161d0 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
161e0 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
161f0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
16200 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16220 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
16230 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
16240 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
16250 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
16260 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16280 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
16290 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
162a0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
162b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
162c0 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
162d0 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
162e0 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
162f0 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
16300 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
16310 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
16320 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
16330 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
16340 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
16350 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
16360 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
16370 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
16380 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
16390 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
163a0 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
163b0 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
163c0 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
163d0 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
163e0 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
163f0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
16400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
16410 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
16420 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
16430 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
16440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16450 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16460 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
16470 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
16480 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
164a0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
164b0 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
164c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
164d0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
164e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20   */../*.** Read 
164f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
16500 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
16510 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16530 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72  readDbPage(Pager
16540 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
16550 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
16560 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
16570 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
16580 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16590 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
165a0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
165b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
165c0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
165d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
165e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
165f0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
16600 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16620 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
16630 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16640 20 7d 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50   }.  IOTRACE(("P
16650 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16660 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 50  ager, pgno)).  P
16670 41 47 45 52 54 52 41 43 45 33 28 22 46 45 54 43  AGERTRACE3("FETC
16680 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
16690 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
166a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
166b0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
166c0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
166d0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
166e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
166f0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
16700 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16710 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73   to obtain the s
16720 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69  hared lock requi
16730 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61  red before.** da
16740 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66  ta may be read f
16750 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
16760 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72  che. If the shar
16770 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65  ed lock has alre
16780 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61  ady.** been obta
16790 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
167a0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
167b0 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c  **.** Immediatel
167c0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
167d0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  g the shared loc
167e0 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  k (if required),
167f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
16800 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68  * checks for a h
16810 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ot-journal file.
16820 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
16830 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  , an emergency r
16840 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65  ollback.** is pe
16850 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74  rformed immediat
16860 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
16870 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  nt pagerSharedLo
16880 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
16890 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
168a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
168b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
168c0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
168d0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
168e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
168f0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
16900 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
16910 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
16920 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16930 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
16940 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
16950 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
16960 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16970 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16980 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16990 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
169a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
169b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
169c0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
169d0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
169e0 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
169f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
16a00 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
16a10 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
16a20 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
16a30 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16a40 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
16a50 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
16a60 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
16a70 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
16a80 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a       if( hasHotJ
16a90 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29  ournal(pPager) )
16aa0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
16ab0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16ac0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16ad0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
16ae0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
16af0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
16b00 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
16b10 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
16b20 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
16b30 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
16b40 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
16b50 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
16b60 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
16b70 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
16b80 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16b90 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
16ba0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
16bb0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
16bc0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
16bd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
16be0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
16bf0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
16c00 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
16c10 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
16c20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
16c30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
16c40 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
16c50 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
16c60 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
16c70 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
16c80 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
16c90 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
16ca0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
16cb0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
16cc0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
16cd0 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
16ce0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
16cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16d00 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
16d10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16d20 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16d30 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
16d40 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
16d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
16d70 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
16d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16d90 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16da0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16dc0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
16dd0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
16de0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65   .        /* Ope
16df0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
16e00 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
16e10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
16e20 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a  USY if.        *
16e30 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
16e40 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
16e50 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
16e60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16e70 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
16e80 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
16e90 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
16ea0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
16eb0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
16ec0 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
16ed0 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
16ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
16ef0 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lds.        ** a
16f00 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
16f10 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
16f20 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
16f30 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
16f40 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
16f50 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
16f60 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
16f70 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  me..        **..
16f80 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
16f90 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
16fa0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
16fb0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 09  is because in ..
16fc0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
16fd0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
16fe0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
16ff0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
17000 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
17010 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
17020 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
17030 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
17040 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
17050 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
17060 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
17070 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
17080 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
17090 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
170a0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
170b0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
170c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
170d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
170e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
170f0 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
17100 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
17110 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
17120 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20 20  nt ro;.         
17130 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
17140 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
17150 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17160 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
17170 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ite(pPager->zJou
17180 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
17190 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20 20  fd, &ro);.      
171a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
171b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
171c0 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 20 20  ger->jfd );.    
171d0 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a        if( ro ){.
171e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
171f0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17210 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
17220 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
17230 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17240 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17260 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
17270 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
17280 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17290 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
172a0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
172b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
172c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   1;.        pPag
172d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
172e0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
172f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17300 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
17310 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
17320 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
17330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17340 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20  r = 0;. .       
17350 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
17360 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
17370 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
17380 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
17390 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
173a0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
173b0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
173c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
173d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
173e0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
173f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17410 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
17420 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
17430 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
17440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
17450 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
17460 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20  ER_SHARED || .  
17470 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
17480 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
17490 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
174a0 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
174b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
174c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50   }..      if( pP
174d0 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
174e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
174f0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
17500 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
17510 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17520 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
17530 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
17540 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
17550 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
17560 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
17570 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
17580 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
17590 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
175a0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
175b0 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ter.        ** s
175c0 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 69  tored in Pager.i
175d0 43 68 61 6e 67 65 43 6f 75 6e 74 20 6d 61 74 63  ChangeCount matc
175e0 68 65 73 20 74 68 61 74 20 66 6f 75 6e 64 20 6f  hes that found o
175f0 6e 20 70 61 67 65 20 31 20 6f 66 0a 20 20 20 20  n page 1 of.    
17600 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17610 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  ase file, then n
17620 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  o database chang
17630 65 73 20 68 61 76 65 20 6f 63 63 75 72 65 64 20  es have occured 
17640 73 69 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2a  since.        **
17650 20 74 68 65 20 63 61 63 68 65 20 77 61 73 20 6c   the cache was l
17660 61 73 74 20 76 61 6c 69 64 20 61 6e 64 20 69 74  ast valid and it
17670 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 61   is safe to reta
17680 69 6e 20 74 68 65 20 63 61 63 68 65 64 0a 20 20  in the cached.  
17690 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 2e 20        ** pages. 
176a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 61  Otherwise, if Pa
176b0 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74  ger.iChangeCount
176c0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
176d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
176e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e  hange-counter on
176f0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
17700 69 6c 65 2c 20 74 68 65 20 63 75 72 72 65 6e 74  ile, the current
17710 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 73 0a   cache contents.
17720 20 20 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20          ** must 
17730 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
17740 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17750 20 75 38 20 7a 43 5b 34 5d 3b 0a 20 20 20 20 20   u8 zC[4];.     
17760 20 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f     u32 iChangeCo
17770 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  unter = 0;.     
17780 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
17790 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
177a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
177b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
177c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
177d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
177e0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  de;.        }.. 
177f0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
17800 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
17810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
17820 20 74 68 65 20 34 2d 62 79 74 65 20 63 68 61 6e   the 4-byte chan
17830 67 65 20 63 6f 75 6e 74 65 72 20 64 69 72 65 63  ge counter direc
17840 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  tly from the fil
17850 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
17860 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
17870 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32  ek(pPager->fd, 2
17880 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
17890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
178a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
178b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
178c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
178d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
178e0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  ad(pPager->fd, z
178f0 43 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  C, 4);.         
17900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17940 20 20 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 65     iChangeCounte
17950 72 20 3d 20 28 7a 43 5b 30 5d 3c 3c 32 34 29 20  r = (zC[0]<<24) 
17960 2b 20 28 7a 43 5b 31 5d 3c 3c 31 36 29 20 2b 20  + (zC[1]<<16) + 
17970 28 7a 43 5b 32 5d 3c 3c 38 29 20 2b 20 7a 43 5b  (zC[2]<<8) + zC[
17980 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  3];.        }.. 
17990 20 20 20 20 20 20 20 69 66 28 20 69 43 68 61 6e         if( iChan
179a0 67 65 43 6f 75 6e 74 65 72 21 3d 70 50 61 67 65  geCounter!=pPage
179b0 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
179c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
179d0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
179e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
179f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
17a00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
17a10 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
17a20 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41  Pager->state<=PA
17a30 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
17a40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17a50 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
17a60 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
17a70 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
17a80 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
17a90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
17aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
17ab0 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
17ac0 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
17ad0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
17ae0 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
17af0 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
17b00 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
17b10 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
17b20 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
17b30 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
17b40 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
17b50 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
17b60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
17b70 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
17b80 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
17b90 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
17ba0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
17bb0 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
17bc0 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
17bd0 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
17be0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
17bf0 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
17c00 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
17c10 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
17c20 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
17c30 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
17c40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17c50 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
17c60 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
17c70 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
17c80 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
17c90 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
17ca0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
17cb0 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
17cc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
17cd0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
17ce0 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
17cf0 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
17d00 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
17d10 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
17d20 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
17d30 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
17d40 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
17d50 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
17d60 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
17d70 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
17d80 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
17d90 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
17da0 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
17db0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
17dc0 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
17dd0 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
17de0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
17df0 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
17e00 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
17e10 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
17e20 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
17e30 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
17e40 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
17e50 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
17e60 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
17e70 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
17e80 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
17e90 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
17ea0 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
17eb0 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
17ec0 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
17ed0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
17ee0 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
17ef0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
17f00 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
17f10 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
17f20 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
17f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17f40 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
17f50 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
17f60 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66   PgHdr if any of
17f70 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74   the four condit
17f80 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20  ions defined .  
17f90 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a  ** above is met:
17fa0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
17fb0 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
17fc0 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61  mxPage.   || pPa
17fd0 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a  ger->pFirst==0 .
17fe0 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c     || MEMDB.   |
17ff0 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73  | (pPager->pFirs
18000 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
18010 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
18020 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
18030 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
18040 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
18050 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
18060 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
18070 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
18080 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
18090 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
180a0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
180b0 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
180c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
180d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
180e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
180f0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
18100 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
18110 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
18120 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
18130 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65  of(*pPg) + pPage
18140 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  r->pageSize.    
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
18170 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
18180 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
181b0 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a  f(PgHistory) );.
181c0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
181d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
181e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
181f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
18200 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
18210 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20      memset(pPg, 
18220 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29  0, sizeof(*pPg))
18230 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
18240 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
18250 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
18260 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
18270 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
18280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
18290 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
182a0 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
182b0 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
182c0 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  All;.    pPager-
182d0 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
182e0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
182f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18300 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ->nPage>pPager->
18310 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20  nMaxPage ){.    
18320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18330 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61  ->nMaxPage==(pPa
18340 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b  ger->nPage-1) );
18350 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
18360 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d  MaxPage++;.    }
18370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18380 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
18390 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
183a0 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
183b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
183c0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
183d0 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
183e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
183f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18400 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
18410 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
18420 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18430 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
18440 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
18450 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
18460 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
18470 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
18480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18490 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
184a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
184b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
184c0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
184d0 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
184e0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
184f0 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
18500 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
18510 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
18520 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
18530 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
18540 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
18550 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
18560 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
18570 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
18580 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
18590 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
185a0 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
185b0 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
185c0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
185d0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
185e0 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
185f0 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
18600 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
18610 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
18620 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
18630 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
18640 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
18650 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
18660 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
18670 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
18680 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
18690 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
186a0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
186b0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
186c0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
186d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
186e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
186f0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
18700 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
18710 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18720 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
18730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
18740 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
18750 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
18760 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
18770 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
18780 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
18790 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
187a0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
187b0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
187c0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
187d0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
187e0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
187f0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
18800 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
18810 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
18820 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
18830 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
18840 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
18850 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
18860 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
18870 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
18880 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
18890 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
188a0 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
188b0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
188c0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
188d0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
188e0 63 6c 72 46 6c 61 67 20 69 73 20 66 61 6c 73 65  clrFlag is false
188f0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
18900 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
18910 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
18920 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67 20 69  .** If clfFlag i
18930 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
18940 20 74 68 65 20 70 61 67 65 20 69 73 20 61 62 6f   the page is abo
18950 75 74 20 74 6f 20 62 65 20 65 72 61 73 65 64 20  ut to be erased 
18960 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74 65 6e  and.** rewritten
18970 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 62   without first b
18980 65 69 6e 67 20 72 65 61 64 20 73 6f 20 74 68 65  eing read so the
18990 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
189a0 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 64  t doing.** the d
189b0 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20  isk I/O..*/.int 
189c0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
189d0 69 72 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ire(Pager *pPage
189e0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 44 62  r, Pgno pgno, Db
189f0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 69  Page **ppPage, i
18a00 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20 20 50  nt clrFlag){.  P
18a10 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
18a20 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18a30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18a40 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70  AGER_UNLOCK || p
18a50 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
18a60 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f   pgno==1 );..  /
18a70 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
18a80 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
18a90 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
18aa0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
18ab0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
18ac0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
18ad0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
18ae0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
18af0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
18b00 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
18b10 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
18b20 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18b30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18b40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18b50 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
18b60 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
18b70 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
18b80 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
18b90 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
18ba0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
18bb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
18bc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18bd0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
18be0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
18bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
18c00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
18c10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
18c20 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
18c30 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
18c40 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
18c50 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
18c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
18c70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
18c80 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
18c90 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
18ca0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
18cb0 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
18cc0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
18cd0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
18ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18d00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18d10 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18d20 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
18d30 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
18d40 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
18d50 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
18d60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
18d70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
18d80 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
18d90 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
18da0 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20  t nMax;.    int 
18db0 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  h;.    TEST_INCR
18dc0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
18dd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
18de0 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
18df0 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
18e00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18e20 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
18e30 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
18e40 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18e50 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
18e60 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
18e70 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
18e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
18e90 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
18ea0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
18eb0 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
18ec0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
18ed0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
18ee0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
18ef0 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
18f00 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
18f10 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
18f20 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
18f30 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18f50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
18f60 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
18f70 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
18f80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18f90 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
18fa0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
18fb0 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
18fc0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
18fd0 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
18fe0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
18ff0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
19000 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
19010 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
19020 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
19030 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
19040 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
19050 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  }.    makeClean(
19060 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
19070 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
19080 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
19090 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
190a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
190b0 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
190c0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
190d0 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
190e0 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
190f0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
19100 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
19110 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19120 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
19130 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19140 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
19150 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
19160 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50  );.      rc = pP
19170 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
19180 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
191a0 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
191b0 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
191c0 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
191d0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
191e0 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
191f0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
19200 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
19210 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
19220 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
19230 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63 6c   || MEMDB || (cl
19240 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65 72  rFlag && !pPager
19250 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
19260 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ) ){.      memse
19270 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
19280 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
19290 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
192a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
192b0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61  = readDbPage(pPa
192c0 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b  ger, pPg, pgno);
192d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
192e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
192f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
19300 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
19310 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30     pPg->pgno = 0
19320 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19330 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
19340 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19350 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   rc;.      }else
19360 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
19370 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
19380 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
19390 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
193a0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
193b0 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
193c0 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
193d0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
193e0 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
193f0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
19400 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
19410 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
19420 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
19430 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
19440 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
19450 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
19460 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
19470 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
19480 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
19490 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
194a0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
194b0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
194c0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
194d0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
194e0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
194f0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
19500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19510 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
19520 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
19530 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
19540 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
19550 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
19560 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  );.    TEST_INCR
19570 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
19580 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
19590 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
195a0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
195b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
195c0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
195d0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
195e0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
195f0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
19600 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
19610 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
19620 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
19630 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
19640 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
19650 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
19660 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
19670 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
19680 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
19690 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
196a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
196b0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
196c0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
196d0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
196e0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
196f0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
19700 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19710 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
19720 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
19730 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
19740 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
19750 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
19760 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
19770 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
19780 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
19790 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
197a0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
197b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
197c0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
197d0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
197e0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
197f0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
19800 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19810 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19820 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
19830 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
19840 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
19850 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20  usiveMode );.   
19860 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
19870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19880 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
19890 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
198a0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
198b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
198c0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
198d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
198e0 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
198f0 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
19900 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
19910 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
19920 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
19930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
19940 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
19950 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
19960 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
19970 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
19980 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
19990 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
199a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
199b0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
199c0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
199d0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
199e0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
199f0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
19a00 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
19a10 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19a20 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20  DbPage *pPg){.. 
19a30 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19a40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
19a50 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
19a60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
19a70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
19a80 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
19a90 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
19aa0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
19ab0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
19ac0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
19ad0 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
19ae0 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
19af0 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
19b00 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
19b10 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
19b20 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
19b30 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
19b40 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
19b50 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
19b60 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
19b70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
19b80 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
19b90 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
19ba0 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
19bb0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
19bc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
19bd0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
19be0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
19bf0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
19c00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19c10 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
19c20 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
19c30 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
19c40 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
19c50 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
19c60 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
19c70 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
19c80 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
19c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
19ca0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
19cb0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
19cc0 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
19cd0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19ce0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
19cf0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
19d00 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
19d10 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
19d20 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
19d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19d40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
19d50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
19d60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19d70 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
19d80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
19d90 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
19da0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
19db0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
19dc0 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
19dd0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
19de0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
19df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
19e20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
19e30 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
19e40 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
19e50 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
19e60 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
19e70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19e80 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
19e90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19ea0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
19eb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
19ec0 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
19ed0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
19ee0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
19ef0 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
19f00 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
19f10 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
19f20 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
19f30 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
19f40 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
19f50 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
19f60 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
19f70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
19f80 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
19f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19fa0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
19fb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19fc0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19fd0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
19fe0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
19ff0 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1a000 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1a010 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1a020 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1a030 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1a040 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1a050 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1a060 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1a070 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1a080 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a090 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1a0a0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1a0b0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1a0c0 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
1a0d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1a0e0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a120 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  e);.  assert( rc
1a130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1a140 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20  Pager->jfd );.  
1a150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a160 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
1a170 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1a180 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1a190 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
1a1a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a1b0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1a1c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1a1d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
1a1e0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
1a1f0 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
1a200 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1a210 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1a220 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
1a230 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
1a240 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
1a250 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
1a260 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
1a270 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1a280 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
1a290 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
1a2a0 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
1a2b0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1a2c0 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
1a2d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a2e0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
1a2f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1a300 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
1a310 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1a320 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1a330 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
1a340 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1a350 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1a360 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
1a370 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1a380 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
1a390 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1a3a0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1a3b0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1a3c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1a3d0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
1a3e0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1a3f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1a400 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
1a410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a430 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1a440 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1a450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a460 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
1a470 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1a480 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1a490 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
1a4a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a4b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a4c0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1a4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a4e0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
1a4f0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
1a500 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
1a510 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a520 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1a530 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
1a540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a550 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
1a560 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
1a570 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
1a580 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
1a590 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
1a5a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
1a5b0 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
1a5c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
1a5d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
1a5e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1a5f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1a600 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
1a610 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1a620 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
1a630 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1a640 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
1a650 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
1a660 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
1a670 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
1a680 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
1a690 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
1a6a0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
1a6b0 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
1a6c0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
1a6d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a6e0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
1a6f0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
1a700 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
1a710 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
1a720 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1a730 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1a740 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
1a750 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
1a760 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1a770 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1a780 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1a790 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1a7a0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
1a7b0 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
1a7c0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
1a7d0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
1a7e0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
1a7f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1a800 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
1a810 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
1a820 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
1a830 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
1a840 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1a850 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1a860 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
1a870 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
1a880 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
1a890 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1a8a0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1a8b0 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1a8c0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1a8d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1a8e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1a8f0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1a900 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1a910 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1a920 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1a930 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1a940 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1a950 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1a960 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1a970 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1a980 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1a990 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1a9a0 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1a9b0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1a9c0 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1a9d0 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1a9e0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1a9f0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1aa00 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1aa10 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1aa20 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1aa30 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1aa40 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1aa50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1aa60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1aa70 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1aa80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1aa90 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1aaa0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1aab0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1aac0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1aad0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1aae0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1aaf0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1ab00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ab10 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1ab20 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
1ab30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1ab40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1ab50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ab60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1ab70 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
1ab80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
1ab90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1aba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1abb0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1abc0 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1abd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
1abe0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1abf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1ac00 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1ac10 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1ac20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ac30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1ac40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ac50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ac60 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1ac70 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1ac80 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
1ac90 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1aca0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1acb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1acc0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1acd0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1ace0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1acf0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
1ad00 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1ad10 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1ad20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ad30 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1ad40 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1ad50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ad60 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1ad70 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1ad80 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1ad90 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1ada0 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
1adb0 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1adc0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1add0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1ade0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1adf0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1ae00 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1ae10 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1ae20 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1ae30 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1ae40 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1ae50 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1ae60 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
1ae70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ae80 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1ae90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aea0 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
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 73 71 6c 69 74 65  =0 );.    sqlite
1aee0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1aef0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1af00 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1af10 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1af20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1af30 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
1af40 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
1af50 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1af60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1af70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1af80 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1af90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1afa0 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1afb0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1afc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1afd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1afe0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1aff0 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1b000 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1b010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1b020 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b030 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1b040 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1b050 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1b060 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1b070 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1b080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b090 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1b0a0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
1b0b0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
1b0c0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1b0d0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1b0e0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b0f0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1b100 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
1b110 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
1b120 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
1b130 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
1b140 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
1b150 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1b160 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
1b170 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
1b180 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
1b190 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1b1a0 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
1b1b0 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
1b1c0 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
1b1d0 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
1b1e0 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
1b1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b200 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
1b210 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1b220 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
1b230 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1b240 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
1b250 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1b260 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
1b270 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  rty = pPg->pPrev
1b280 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1b290 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44   if( pPg->pPrevD
1b2a0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1b2b0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
1b2c0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1b2d0 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
1b2e0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
1b2f0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
1b300 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
1b310 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
1b320 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
1b330 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
1b340 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
1b350 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1b360 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
1b370 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1b380 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1b390 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
1b3a0 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
1b3b0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
1b3c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1b3d0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1b3e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1b3f0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
1b400 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
1b410 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
1b420 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b430 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1b440 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
1b450 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
1b460 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
1b470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b480 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
1b490 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
1b4a0 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
1b4b0 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
1b4c0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
1b4d0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
1b4e0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
1b4f0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
1b500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1b510 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1b520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
1b530 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
1b540 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1b550 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
1b560 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
1b570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b580 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
1b590 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
1b5a0 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
1b5b0 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
1b5c0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
1b5d0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
1b5e0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
1b5f0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
1b600 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
1b610 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
1b620 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1b630 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
1b640 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b650 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
1b660 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
1b670 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
1b680 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
1b690 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1b6a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1b6b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b6c0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
1b6d0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
1b6e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1b6f0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
1b700 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1b710 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1b720 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
1b730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b740 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
1b750 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1b760 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
1b770 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1b780 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
1b790 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
1b7a0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
1b7b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b7c0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
1b7d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
1b7e0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
1b7f0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
1b800 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
1b810 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
1b820 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
1b830 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
1b840 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
1b850 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1b860 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1b870 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
1b880 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
1b890 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
1b8a0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
1b8b0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
1b8c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
1b8d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1b8e0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
1b8f0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
1b900 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
1b910 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
1b920 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
1b930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b940 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1b950 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
1b960 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
1b970 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1b980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b990 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1b9a0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
1b9b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1b9c0 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
1b9d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b9e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b9f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1ba00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1ba10 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1ba20 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
1ba30 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1ba40 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1ba50 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
1ba60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1ba70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1ba80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1ba90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1baa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1bab0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1bad0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
1bae0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
1baf0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1bb00 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
1bb10 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1bb20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
1bb30 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
1bb40 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
1bb50 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1bb60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1bb70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1bb80 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
1bb90 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
1bba0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
1bbb0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
1bbc0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1bbd0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1bbe0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
1bbf0 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72  urnal && (pPager
1bc00 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->useJournal || 
1bc10 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
1bc20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
1bc30 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1bc40 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1bc50 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
1bc60 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1bc70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
1bc80 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1bc90 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1bca0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1bcb0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1bcc0 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
1bcd0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1bce0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1bcf0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1bd00 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1bd10 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
1bd20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
1bd30 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
1bd40 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1bd50 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1bd60 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1bd70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
1bd80 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
1bd90 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
1bda0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1bdb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1bdc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bdd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bde0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20       u32 cksum, 
1bdf0 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20  saved;.         
1be00 20 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a   char *pData2, *
1be10 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20  pEnd;.          
1be20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
1be30 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
1be40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1be50 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
1be60 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
1be70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
1be80 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
1be90 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
1bea0 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
1beb0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
1bec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
1bed0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
1bee0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1bef0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1bf00 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
1bf10 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1bf20 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1bf30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
1bf40 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
1bf50 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
1bf60 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ta2);.          
1bf70 70 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20  pEnd = pData2 + 
1bf80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1bf90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
1bfa0 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  a2 -= 4;.       
1bfb0 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32     saved = *(u32
1bfc0 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  *)pEnd;.        
1bfd0 20 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64    put32bits(pEnd
1bfe0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
1bff0 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65      szPg = pPage
1c000 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20  r->pageSize+8;. 
1c010 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
1c020 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
1c030 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1c040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c050 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1c060 2c 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b  , pData2, szPg);
1c070 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
1c080 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
1c090 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
1c0a0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  er, pPg->pgno,. 
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c0d0 6c 4f 66 66 2c 20 73 7a 50 67 29 29 0a 20 20 20  lOff, szPg)).   
1c0e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1c0f0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
1c100 67 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  g;.          PAG
1c110 45 52 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41  ERTRACE4("JOURNA
1c120 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
1c130 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c150 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c160 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1c170 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1c180 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45 6e 64       *(u32*)pEnd
1c190 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a   = saved;...  /*
1c1a0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
1c1b0 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
1c1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c1d0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
1c1e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1c1f0 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
1c200 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
1c210 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
1c220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c240 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1c250 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c260 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1c270 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
1c280 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
1c290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1c2a0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1c2b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c2c0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1c2d0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1c2e0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1c2f0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
1c300 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
1c310 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1c320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c330 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1c340 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1c350 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1c360 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1c370 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1c380 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1c390 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1c3a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1c3c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
1c3d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1c3e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1c3f0 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1c400 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1c410 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50  PAGERTRACE4("APP
1c420 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1c430 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c450 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c460 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1c470 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1c480 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1c490 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1c4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1c4b0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1c4c0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
1c4d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1c4e0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1c4f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1c500 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1c510 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1c520 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1c530 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1c540 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1c550 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1c560 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1c570 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1c580 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1c590 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1c5a0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1c5b0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1c5c0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1c5d0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1c5e0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1c5f0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1c600 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1c610 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1c620 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1c630 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1c640 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1c650 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1c660 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
1c670 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
1c680 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1c690 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1c6a0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1c6b0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1c6c0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1c6d0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1c6e0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1c6f0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
1c700 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1c710 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1c720 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
1c730 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
1c740 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
1c750 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
1c760 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1c770 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
1c780 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1c790 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
1c7b0 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1c7c0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1c7d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c7e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1c7f0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
1c800 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1c810 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1c820 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1c830 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
1c840 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1c850 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1c860 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
1c870 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c880 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1c890 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1c8a0 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
1c8b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1c8c0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1c8d0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c8e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c8f0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1c940 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
1c950 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1c960 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1c970 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
1c980 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c990 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1c9a0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1c9b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c9c0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1c9d0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1c9e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
1c9f0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
1ca00 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
1ca10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1ca20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1ca30 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1ca40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1ca50 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
1ca60 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1ca70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1ca80 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
1ca90 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1caa0 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
1cab0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
1cac0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1cad0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
1cae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1caf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cb00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cb10 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20  is used to mark 
1cb20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77  a data-page as w
1cb30 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73  ritable. It uses
1cb40 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65   .** pager_write
1cb50 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75  () to open a jou
1cb60 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74  rnal file (if it
1cb70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1cb80 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69  open).** and wri
1cb90 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61  te the page *pDa
1cba0 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ta to the journa
1cbb0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  l..**.** The dif
1cbc0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1cbd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
1cbe0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
1cbf0 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1cc00 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
1cc10 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
1cc20 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
1cc30 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
1cc40 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
1cc50 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
1cc60 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
1cc70 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
1cc80 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
1cc90 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1cca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ccb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1ccc0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1ccd0 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
1cce0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1ccf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cd00 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
1cd10 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
1cd20 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1cd30 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
1cd40 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
1cd50 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
1cd60 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
1cd70 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
1cd80 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67  ( !MEMDB && nPag
1cd90 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
1cda0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
1cdb0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
1cdc0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1cdd0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1cde0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
1cdf0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
1ce00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1ce10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1ce20 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1ce30 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
1ce40 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ce60 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
1ce70 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
1ce80 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
1ce90 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  t ii;..    /* Se
1cea0 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  t the doNotSync 
1ceb0 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
1cec0 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
1ced0 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75  nnot allow a jou
1cee0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64  rnal.    ** head
1cef0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
1cf00 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
1cf10 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20  es journaled by 
1cf20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
1cf30 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1cf40 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1cf50 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
1cf60 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1cf70 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
1cf80 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
1cf90 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
1cfa0 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
1cfb0 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
1cfc0 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
1cfd0 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
1cfe0 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
1cff0 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
1d000 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
1d010 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1d020 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1d030 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
1d040 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
1d050 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
1d060 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1d070 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67  ) + 1;..    nPag
1d080 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33  eCount = sqlite3
1d090 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1d0a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d0b0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1d0c0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1d0d0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1d0e0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1d0f0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1d100 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
1d110 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1d120 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1d130 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
1d140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1d150 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
1d160 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
1d170 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
1d180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
1d190 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
1d1a0 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
1d1b0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
1d1c0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1d1d0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
1d1e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
1d1f0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
1d200 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
1d210 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
1d220 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70  Journal || pg==p
1d230 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20  Pg->pgno || .   
1d240 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72         pg>pPager
1d250 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20  ->origDbSize || 
1d260 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1d270 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28  rnal[pg/8]&(1<<(
1d280 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20  pg&7))).      ) 
1d290 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1d2a0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1d2b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1d2c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1d2d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
1d2e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1d2f0 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
1d300 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d320 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d330 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1d340 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1d350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1d360 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
1d370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d390 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1d3a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1d3b0 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
1d3c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1d3d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1d3e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1d3f0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
1d400 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1d420 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
1d430 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1d440 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
1d450 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
1d460 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d470 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
1d480 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
1d490 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
1d4a0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
1d4b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1d4c0 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
1d4d0 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
1d4e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1d4f0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
1d500 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
1d510 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  irty;.}.#endif..
1d520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d530 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
1d540 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
1d550 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
1d560 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
1d570 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1d580 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
1d590 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1d5a0 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74  te3PagerOverwrit
1d5b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1d5c0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
1d5d0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
1d5e0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1d5f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1d600 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1d610 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20  , pgno, &pPg);. 
1d620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d630 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d640 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d650 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1d660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d670 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c        memcpy(sql
1d680 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1d690 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50  (pPg), pData, pP
1d6a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d6b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d6c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1d6d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d6e0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1d6f0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1d700 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1d710 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1d720 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1d730 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1d740 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1d750 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
1d760 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1d770 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1d780 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1d790 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1d7a0 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
1d7b0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
1d7c0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
1d7d0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
1d7e0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
1d7f0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
1d800 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
1d810 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
1d820 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d830 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1d840 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1d850 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1d860 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1d870 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1d880 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1d890 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1d8a0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d8b0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1d8c0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1d8d0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1d8e0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1d8f0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1d900 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1d910 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1d920 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1d930 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d940 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1d950 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1d960 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1d970 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1d980 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d990 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
1d9a0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1d9b0 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1d9c0 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1d9d0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1d9e0 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1d9f0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1da00 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1da10 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1da20 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1da30 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1da40 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1da50 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1da60 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1da70 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1da80 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1da90 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1daa0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1dab0 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1dac0 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1dad0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1dae0 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1daf0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1db00 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1db10 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
1db20 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
1db30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1db40 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1db50 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
1db60 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
1db70 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1db80 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1db90 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
1dba0 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
1dbb0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1dbc0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
1dbd0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1dbe0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1dbf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1dc00 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1dc10 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1dc20 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1dc30 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1dc40 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1dc50 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
1dc60 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65  pPg!=0 );  /* We
1dc70 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e   never call _don
1dc80 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74  t_write unless t
1dc90 68 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65  he page is in me
1dca0 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61  m */.  pPg->alwa
1dcb0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1dcc0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1dcd0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
1dce0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
1dcf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1dd00 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1dd10 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1dd20 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
1dd30 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
1dd40 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1dd50 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
1dd60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1dd70 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
1dd80 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
1dd90 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
1dda0 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
1ddb0 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
1ddc0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1ddd0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
1dde0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
1ddf0 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
1de00 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
1de10 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
1de20 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
1de30 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
1de40 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
1de50 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
1de60 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
1de70 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
1de80 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
1de90 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
1dea0 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
1deb0 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
1dec0 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
1ded0 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
1dee0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
1def0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
1df00 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
1df10 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1df20 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
1df30 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
1df40 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
1df50 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1df60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1df70 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
1df80 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
1df90 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
1dfa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1dfb0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1dfc0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
1dfd0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a   pPager, pgno)).
1dfe0 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
1dff0 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
1e000 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1e010 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1e020 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1e030 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1e040 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1e050 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1e060 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1e070 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1e080 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1e090 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1e0a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1e0b0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1e0c0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1e0d0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1e0e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1e0f0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1e100 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1e110 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1e120 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1e130 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
1e140 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1e150 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70  llback(DbPage *p
1e160 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1e170 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e180 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
1e190 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1e1a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1e1b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1e1c0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
1e1d0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
1e1e0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e1f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
1e200 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
1e210 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1e220 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1e230 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1e240 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1e250 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1e260 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e270 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1e280 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1e290 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1e2a0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1e2b0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1e2c0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e2d0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
1e2e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1e2f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1e300 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1e310 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1e320 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1e330 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1e340 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1e350 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  }.    PAGERTRACE
1e360 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
1e370 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1e380 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1e390 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1e3a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41      IOTRACE(("GA
1e3b0 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
1e3c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1e3d0 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  o)).  }.  if( pP
1e3e0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e3f0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
1e400 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1e410 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1e420 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1e430 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1e440 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1e450 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1e460 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
1e470 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1e480 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1e490 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1e4a0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1e4b0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1e4c0 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
1e4d0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1e4e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1e4f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e500 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1e510 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1e520 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1e530 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1e540 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1e550 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1e560 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e570 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e580 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1e590 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1e5a0 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
1e5b0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
1e5c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  t rc;..  if( !pP
1e5d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1e5e0 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20  tDone ){.    /* 
1e5f0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1e600 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1e610 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
1e620 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e630 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
1e640 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1e650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e660 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1e670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e680 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ite(pPgHdr);.   
1e690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e6a0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1e6b0 20 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74    .    /* Read t
1e6c0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1e6d0 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
1e6e0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e6f0 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62  er = retrieve32b
1e700 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b  its(pPgHdr, 24);
1e710 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  .  .    /* Incre
1e720 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1e730 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1e740 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1e750 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
1e760 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1e770 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
1e780 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
1e790 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c  ATA(pPgHdr))+24,
1e7a0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1e7b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43  ;.    pPager->iC
1e7c0 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68 61  hangeCount = cha
1e7d0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a  nge_counter;.  .
1e7e0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
1e7f0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1e800 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1e810 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1e820 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
1e830 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1e840 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
1e850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e860 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1e870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1e880 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1e890 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1e8a0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1e8b0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1e8c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1e8d0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1e8e0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1e8f0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1e900 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1e910 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1e920 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1e930 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1e940 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1e950 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1e960 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1e970 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1e980 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1e990 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1e9a0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1e9b0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1e9c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e9d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1e9e0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1e9f0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1ea00 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1ea10 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1ea20 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1ea30 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1ea40 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1ea50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ea60 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1ea70 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1ea80 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1ea90 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1eaa0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1eab0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1eac0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1ead0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1eae0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
1eaf0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1eb00 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
1eb10 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
1eb20 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
1eb30 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
1eb40 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
1eb50 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
1eb60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
1eb70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1eb80 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1eb90 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  One(Pager *pPage
1eba0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
1ebb0 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72  Master, Pgno nTr
1ebc0 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
1ebd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1ebe0 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1ebf0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1ec00 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1ec10 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1ec20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1ec30 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1ec40 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1ec50 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1ec60 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1ec70 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1ec80 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1ec90 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1eca0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1ecb0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1ecc0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1ecd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1ece0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1ecf0 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1ed00 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1ed10 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1ed20 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
1ed30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ed40 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
1ed50 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1ed60 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
1ed70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1ed80 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
1ed90 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1eda0 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
1edb0 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
1edc0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
1edd0 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
1ede0 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
1edf0 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
1ee00 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1ee10 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
1ee20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1ee30 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
1ee40 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
1ee50 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
1ee60 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1ee70 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
1ee80 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
1ee90 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
1eea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1eeb0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1eec0 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
1eed0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1eee0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
1eef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ef00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1ef10 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
1ef20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ef30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ef40 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1ef50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1ef60 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1ef70 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1ef80 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1ef90 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1efa0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
1efb0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
1efc0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
1efd0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
1efe0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1eff0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1f000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f010 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
1f020 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45  int iSkip = PAGE
1f030 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1f040 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  );.        for( 
1f050 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1f060 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1f070 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1f080 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72      if( !(pPager
1f090 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38  ->aInJournal[i/8
1f0a0 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20  ] & (1<<(i&7))) 
1f0b0 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
1f0c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f0d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1f0e0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
1f0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f100 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f110 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1f130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f140 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
1f150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f160 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1f170 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1f180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f190 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1f1a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f1b0 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
1f1c0 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
1f1d0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
1f1e0 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
1f1f0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1f200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f210 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1f220 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
1f230 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1f240 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f250 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1f260 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
1f270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f280 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f290 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1f2a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f2b0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1f2c0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1f2d0 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1f2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f2f0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1f300 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1f310 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1f320 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1f330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f340 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
1f350 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1f360 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1f370 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1f380 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1f390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f3a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f3b0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70  sync_exit;.    p
1f3c0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1f3d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
1f3e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f3f0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1f400 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1f410 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f420 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1f430 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ->fd, 0);.    }.
1f440 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
1f450 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1f460 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
1f470 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1f480 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
1f490 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
1f4a0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
1f4b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
1f4c0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1f4d0 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
1f4e0 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
1f4f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1f500 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
1f510 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1f520 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
1f530 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
1f540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
1f550 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
1f560 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
1f570 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
1f580 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
1f590 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f5a0 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
1f5b0 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
1f5c0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1f5d0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
1f5e0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f5f0 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
1f600 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f610 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
1f620 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1f630 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1f640 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1f650 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1f660 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
1f670 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
1f680 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f690 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1f6a0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d  PAGERTRACE2("COM
1f6b0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1f6c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
1f6d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1f6e0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
1f6f0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
1f700 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
1f710 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
1f720 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
1f730 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1f740 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
1f750 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1f760 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1f770 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1f780 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
1f790 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1f7a0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
1f7b0 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
1f7c0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1f7d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
1f7e0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1f7f0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1f800 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  >pDirty = 0;.#if
1f810 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1f820 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1f830 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1f840 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1f850 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1f860 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1f870 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1f880 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1f890 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1f8a0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1f8b0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1f8c0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1f8d0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1f8e0 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1f8f0 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1f900 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1f910 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1f920 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1f930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f940 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1f950 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f960 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1f970 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
1f980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f990 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1f9a0 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72  YNCED || !pPager
1f9b0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
1f9c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1f9d0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1f9e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
1f9f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1fa00 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
1fa10 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
1fa20 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
1fa30 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
1fa40 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
1fa50 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
1fa60 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
1fa70 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
1fa80 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
1fa90 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
1faa0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
1fab0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
1fac0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1fad0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
1fae0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1faf0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
1fb00 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
1fb10 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
1fb20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
1fb30 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1fb40 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
1fb50 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1fb60 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
1fb70 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
1fb80 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
1fb90 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
1fba0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
1fbb0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
1fbc0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
1fbd0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
1fbe0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
1fbf0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
1fc00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1fc10 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1fc20 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1fc30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fc40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
1fc50 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
1fc60 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1fc70 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1fc80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
1fc90 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1fca0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
1fcb0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
1fcc0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
1fcd0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
1fce0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
1fcf0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1fd00 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
1fd10 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
1fd20 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1fd30 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1fd40 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1fd50 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1fd60 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
1fd70 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
1fd80 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1fd90 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
1fda0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1fdb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
1fdc0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1fdd0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
1fde0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1fdf0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
1fe00 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
1fe10 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
1fe20 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
1fe30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1fe40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1fe50 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
1fe60 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
1fe70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1fe80 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
1fe90 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
1fea0 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
1feb0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1fec0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1fed0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1fee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1fef0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1ff00 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1ff10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1ff20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1ff30 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1ff40 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1ff50 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1ff60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1ff70 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
1ff80 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
1ff90 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1ffa0 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
1ffb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1ffc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1ffd0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
1ffe0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1fff0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20000 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
20010 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
20020 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
20030 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
20040 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
20050 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
20060 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20070 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
20080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20090 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
200a0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
200b0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
200c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
200d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
200e0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
200f0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
20100 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
20110 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20120 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20130 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20140 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
20150 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20160 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
20170 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
20180 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20190 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
201a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
201b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
201c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
201d0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
201e0 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
201f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
20200 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20210 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
20220 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
20230 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
20240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20250 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
20260 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20270 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20280 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20290 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
202a0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
202b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
202c0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
202d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
202e0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
202f0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
20300 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
20310 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
20320 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
20330 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
20340 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
20350 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
20360 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
20370 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
20380 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
20390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
203a0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
203b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
203c0 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
203d0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
203e0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
203f0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
20400 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
20410 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
20420 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
20430 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
20440 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
20450 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
20460 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
20470 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20480 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
20490 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
204a0 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
204b0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
204c0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
204d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
204e0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
204f0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
20500 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
20510 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
20520 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
20530 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
20540 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
20550 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
20560 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
20570 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
20580 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
20590 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
205a0 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
205b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
205c0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
205d0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
205e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
205f0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
20600 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
20610 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
20620 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
20630 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
20640 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
20650 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
20660 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
20670 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
20680 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
20690 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
206a0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
206b0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
206c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
206d0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
206e0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
206f0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
20700 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
20710 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
20720 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
20730 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
20740 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
20750 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
20760 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
20770 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
20780 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
20790 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
207a0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
207b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
207c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
207d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
207e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
207f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20800 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
20810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
20820 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
20830 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
20840 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
20850 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20860 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
20870 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
20880 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
20890 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
208a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
208b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
208c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
208d0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
208e0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
208f0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
20900 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20930 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
20940 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
20950 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
20960 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
20970 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
20980 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20990 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
209a0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
209b0 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
209c0 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
209d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
209e0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
209f0 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
20a00 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
20a10 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
20a20 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
20a30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
20a40 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
20a50 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
20a60 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
20a70 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20a80 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
20a90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
20aa0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
20ab0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
20ac0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
20ad0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
20ae0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
20af0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
20b00 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
20b10 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
20b20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20b30 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
20b40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20b50 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
20b60 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
20b70 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
20b80 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
20b90 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
20ba0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
20bb0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
20bc0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
20bd0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
20be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20bf0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
20c00 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
20c10 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
20c20 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
20c30 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
20c40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
20c50 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
20c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20c70 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
20c80 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
20c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
20ca0 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
20cb0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
20cc0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20cd0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
20ce0 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
20cf0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
20d00 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
20d10 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20d20 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
20d30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20d40 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
20d50 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
20d60 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
20d70 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
20d80 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
20d90 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
20da0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
20db0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
20dc0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tmt = 0;.    }. 
20dd0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
20de0 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
20df0 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
20e00 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
20e10 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61  extStmt;.      a
20e20 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74  ssert( pPg->inSt
20e30 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  mt );.      pPg-
20e40 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
20e50 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
20e60 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
20e70 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
20e80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
20e90 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
20ea0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
20eb0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
20ec0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20ed0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
20ee0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
20ef0 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
20f00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20f10 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
20f20 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20f30 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
20f40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
20f50 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
20f60 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
20f70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
20f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20f90 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
20fa0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
20fb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
20fc0 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
20fd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20fe0 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
20ff0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21000 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
21010 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
21020 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21030 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
21040 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
21050 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
21060 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21070 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
21080 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
21090 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
210a0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
210b0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
210c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
210d0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
210e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
210f0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
21100 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
21110 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
21120 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
21130 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
21140 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
21150 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
21160 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
21170 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
21190 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
211a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
211b0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
211c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
211d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
211e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
211f0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
21200 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
21210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21220 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
21230 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
21240 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
21250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21260 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
21270 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
21280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21290 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
212a0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
212b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
212c0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
212d0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
212e0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
212f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21300 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
21310 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21320 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
21330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21340 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21350 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
21360 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
21370 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21380 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
21390 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
213a0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
213b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
213c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
213d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
213e0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
213f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21400 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
21410 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
21420 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21430 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
21440 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
21450 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
21460 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
21470 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
21480 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
21490 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
214a0 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
214b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
214c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
214d0 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
214e0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
214f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
21500 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
21510 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
21520 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
21530 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
21540 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
21550 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
21560 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
21570 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
21580 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
21590 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
215a0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
215b0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
215c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
215d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
215e0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
215f0 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
21600 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f  fied by pData to
21610 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
21620 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  n the file. .**.
21630 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
21640 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
21650 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  o the current pa
21660 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72  ge pgno. If curr
21670 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f  ent page.** pgno
21680 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
21690 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
216a0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
216b0 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65  ot written there
216c0 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72   by.** by this r
216d0 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65  outine. The same
216e0 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20   applies to the 
216f0 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72  page pData refer
21700 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f  s to on entry to
21710 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
21720 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
21730 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72  es to the page r
21740 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61  efered to by pDa
21750 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  ta remain valid.
21760 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
21770 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
21780 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
21790 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61  pData (i.e. data
217a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
217b0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
217c0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
217d0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
217e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
217f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
21800 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
21810 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
21820 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
21830 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21840 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
21850 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
21860 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
21870 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
21880 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
21890 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
218a0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
218b0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
218c0 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
218d0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
218e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
218f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
21900 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21910 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
21920 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
21930 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
21940 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
21950 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b  PgOld; .  int h;
21960 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
21970 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
21980 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
21990 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
219a0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
219b0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
219c0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
219d0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
219e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
219f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
21a00 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
21a10 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
21a20 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
21a30 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
21a40 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  ))..  if( pPg->n
21a50 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
21a60 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
21a70 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
21a80 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
21a90 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
21aa0 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
21ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21ac0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
21ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
21ae0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
21af0 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
21b00 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
21b10 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
21b20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
21b30 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
21b40 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
21b50 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
21b60 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
21b70 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
21b80 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
21b90 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
21ba0 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
21bb0 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
21bc0 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
21bd0 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
21be0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
21bf0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
21c00 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
21c10 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
21c20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
21c30 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
21c40 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
21c50 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
21c60 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
21c70 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
21c80 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
21c90 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
21ca0 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d  .    if( pPgOld-
21cb0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
21cc0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
21cd0 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  d->inJournal );.
21ce0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
21cf0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
21d00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
21d10 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
21d20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
21d30 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  c );.    }.  }..
21d40 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
21d50 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
21d60 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69  pPg and insert i
21d70 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68  t into the new h
21d80 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20  ash-chain. */.  
21d90 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
21da0 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  );.  pPg->pgno =
21db0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e   pgno;.  h = pgn
21dc0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
21dd0 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61  sh-1);.  if( pPa
21de0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b  ger->aHash[h] ){
21df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21e00 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
21e10 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
21e20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
21e30 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
21e40 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
21e50 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
21e60 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
21e70 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
21e80 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  ] = pPg;.  pPg->
21e90 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a  pPrevHash = 0;..
21ea0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
21eb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
21ec0 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69  yCache = 1;..  i
21ed0 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
21ee0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
21ef0 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
21f00 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
21f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
21f20 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
21f30 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
21f40 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
21f50 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
21f60 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
21f70 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
21f80 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
21f90 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
21fa0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
21fb0 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
21fc0 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61   Pager.aInJourna
21fd0 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73  l bit has been s
21fe0 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
21ff0 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
22000 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   loading.    ** 
22010 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
22020 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
22030 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
22040 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
22050 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
22060 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   The sqlite3Page
22070 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  rGet() call may 
22080 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
22090 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
220a0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
220b0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
220c0 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
220d0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
220e0 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20  t rc;.    PgHdr 
220f0 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
22100 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
22110 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
22120 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
22130 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
22140 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
22150 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22160 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22170 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
22180 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
22190 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53     pPgHdr->needS
221a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
221b0 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  Hdr->inJournal =
221c0 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74   1;.    makeDirt
221d0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
221e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
221f0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
22200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22210 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
22220 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
22230 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
22240 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
22250 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
22260 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
22270 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
22280 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  ){.  return PGHD
22290 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
222a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
222b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
222c0 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
222d0 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
222e0 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
222f0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
22300 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
22310 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
22320 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
22330 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
22340 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
22350 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
22360 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47  eturn (pPager?PG
22370 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
22380 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a  , pPager):0);.}.
22390 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
223a0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
223b0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
223c0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
223d0 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
223e0 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
223f0 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
22400 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22410 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
22420 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
22430 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
22440 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
22450 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
22460 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
22470 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
22480 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
22490 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
224a0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
224b0 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
224c0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
224d0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
224e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
224f0 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
22500 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
22510 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
22520 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
22530 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
22540 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
22550 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
22560 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
22570 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
22580 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
22590 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
225a0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
225b0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
225c0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
225d0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
225e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
225f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
22600 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
22610 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
22620 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
22630 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
22640 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22650 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
22660 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
22670 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
22680 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
22690 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
226a0 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
226b0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
226c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
226d0 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Mode;.}..#if def
226e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
226f0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
22700 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
22710 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
22720 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
22730 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
22740 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
22750 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
22760 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
22770 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
22780 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
22790 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
227a0 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
227b0 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
227c0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74  lite3PagerLockst
227d0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
227e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
227f0 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28  ite3OsLockState(
22800 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23  pPager->fd);.}.#
22810 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
22820 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
22830 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
22840 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
22850 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
22860 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
22870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22880 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72 20  erRefdump(Pager 
22890 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
228a0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
228b0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
228c0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
228d0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
228e0 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
228f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
22900 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22910 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
22920 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
22930 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
22940 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
22950 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
22960 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
22970 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22980 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.