/ Hex Artifact Content
Login

Artifact 30e4a54e4ce9817839043eaa8968aace95f73ed9:


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 31  : pager.c,v 1.31
0350: 36 20 32 30 30 37 2f 30 34 2f 30 32 20 31 31 3a  6 2007/04/02 11:
0360: 32 32 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a  22:22 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 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3570: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3580: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3590: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
35a0: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
35b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
35c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
35d0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
35e0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
35f0: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
3600: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3620: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3630: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3640: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3650: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
3660: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3670: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
3680: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
3690: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36a0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36b0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36c0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36d0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36e0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
36f0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3700: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3710: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3730: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3740: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3750: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3770: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
3780: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
3790: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
37a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
37b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
37c0: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
37d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37e0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
37f0: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3800: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3810: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
3820: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
3830: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
3840: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
3850: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
3860: 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f  .  u32 iChangeCo
3870: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  unt;           /
3880: 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e  * Db change-coun
3890: 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61  ter for which ca
38a0: 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  che is valid */.
38b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
38c0: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
38d0: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
38e0: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
38f0: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3900: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3910: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3920: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3930: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
3940: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
3950: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
3960: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3970: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3990: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
39a0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
39b0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
39c0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
39d0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
39e0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
39f0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3a00: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3a10: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3a20: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
3a30: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
3a40: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
3a50: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
3a60: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3a70: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
3a80: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3a90: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3aa0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3ab0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3ac0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3ad0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3ae0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3af0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3b00: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3b10: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3b20: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
3b30: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
3b40: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
3b50: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
3b60: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3b70: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3b80: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3b90: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3ba0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3bb0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3bc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3bd0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3be0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3bf0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3c00: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3c10: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3c20: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
3c30: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
3c40: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
3c50: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
3c60: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3c70: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3c80: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3c90: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3ca0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3cb0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3cc0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3cd0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3ce0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3cf0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3d00: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3d10: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3d20: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3d30: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3d40: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3d50: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3d60: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3d70: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3d80: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3d90: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3da0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3db0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3dc0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3dd0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3de0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3df0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3e00: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3e10: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3e20: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3e30: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3e40: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3e50: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3e60: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3e70: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3e80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3e90: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3ea0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3eb0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3ec0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3ed0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3ee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3ef0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3f00: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3f10: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3f20: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3f30: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3f40: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3f50: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3f60: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3f70: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3f80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3f90: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3fa0: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3fb0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3fc0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3fd0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3fe0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3ff0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
4000: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
4010: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
4020: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
4030: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
4040: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
4050: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4060: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4070: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4080: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4090: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
40a0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
40b0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
40c0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
40d0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
40e0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
40f0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
4100: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
4110: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4120: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4130: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4140: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4150: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4160: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4170: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4180: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
41a0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
41b0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
41d0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
41e0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
41f0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
4200: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
4210: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
4220: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
4230: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
4240: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4250: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4260: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4270: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4280: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4290: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
42a0: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
42b0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
42c0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
42d0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
42e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
42f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
4300: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
4310: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
4320: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
4330: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
4340: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4350: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4360: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4370: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4380: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4390: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
43a0: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
43b0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
43c0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
43d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
43e0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
43f0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4400: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4410: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4420: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
4430: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
4440: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4450: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4460: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4470: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
4480: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
4490: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
44a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
44b0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
44c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
44d0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
44e0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
44f0: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
4500: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
4510: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
4520: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
4530: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33  addr=%p nRef=%-3
4540: 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
4550: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4560: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4570: 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61   p->nRef, p->pPa
4580: 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  ger->nRef.    );
4590: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
45a0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
45b0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
45c0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
45d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
45e0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
45f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4600: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4610: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4620: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4630: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4640: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4650: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4660: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4670: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4680: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4690: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
46a0: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
46b0: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
46c0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
46d0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
46e0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
46f0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
4700: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
4710: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4720: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4730: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4740: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4750: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4760: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4770: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4780: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4790: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
47a0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
47b0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
47c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
47d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
47e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
47f0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
4800: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
4810: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4820: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4830: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4840: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4850: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4860: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4870: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4880: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4890: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
48a0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
48b0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
48c0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
48d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
48e0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
48f0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4900: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4910: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4920: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4930: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4940: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4950: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4960: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4970: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4980: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4990: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
49a0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
49b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
49c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
49d0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
49e0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
49f0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4a00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4a10: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4a20: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4a30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4a40: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4a50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4a60: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4a70: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4a80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4a90: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4aa0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4ab0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ac0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4ad0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4ae0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4af0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4b00: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4b10: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4b20: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4b30: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4b40: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4b50: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4b60: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4b70: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4b80: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4b90: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4ba0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4bb0: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4bc0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4bd0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4be0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4bf0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4c10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4c20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4c30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4c40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4c50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4c60: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4c70: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4c80: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4c90: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4ca0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4cb0: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4cc0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4cd0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4ce0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4cf0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4d00: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4d10: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4d20: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4d30: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4d40: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4d50: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4d60: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4d70: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4d80: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4d90: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4da0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4db0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4dc0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4dd0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4df0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4e00: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4e10: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4e20: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4e30: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4e40: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4e50: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4e60: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4e70: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4e80: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4e90: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4ea0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4eb0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ec0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4ed0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ee0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4ef0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4f00: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4f10: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4f20: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4f30: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
4f40: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
4f50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4f60: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4f70: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4f80: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4f90: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4fa0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4fb0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4fd0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4fe0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4ff0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
5000: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
5010: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5020: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5030: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5040: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5050: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5060: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5080: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
5090: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
50a0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
50b0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
50c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50d0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
50e0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
5100: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
5110: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5120: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5130: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5140: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5150: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5160: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5170: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5180: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5190: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
51a0: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
51b0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
51c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
51d0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
51e0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
51f0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
5200: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
5210: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5220: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5230: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5240: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5250: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5260: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5270: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5280: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5290: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
52a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
52b0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
52c0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
52d0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
52e0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
52f0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5300: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5310: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5320: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5330: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5340: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5350: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5360: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5370: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5380: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
5390: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
53a0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
53b0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
53c0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
53d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
53e0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
53f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5400: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5410: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5420: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5430: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5450: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5460: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5470: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5480: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5490: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
54a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54b0: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
54c0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
54d0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
54e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
54f0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5500: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5510: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5520: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5530: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5540: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5550: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5560: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5570: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5590: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
55a0: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
55b0: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
55c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
55d0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
55e0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
55f0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5600: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5610: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5620: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5630: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5640: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5660: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5670: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5680: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5690: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
56a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
56b0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
56c0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
56d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
56e0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
56f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5700: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5720: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5730: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5740: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5750: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5760: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5780: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5790: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
57a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
57b0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
57c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
57d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
57f0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5800: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5820: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5830: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5840: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5850: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5860: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5870: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5880: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5890: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
58a0: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
58b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
58c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
58d0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
58e0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
58f0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5900: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5910: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5920: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5930: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5940: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5950: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5960: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5970: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5980: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5990: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
59a0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
59b0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
59c0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
59d0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
59e0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
59f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a00: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5a10: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5a20: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5a30: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5a40: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5a50: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5a60: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5a70: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5a80: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5a90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5aa0: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5ab0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5ad0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5ae0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5b10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b20: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5b30: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5b40: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5b50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5b60: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5b70: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5b80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5b90: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5ba0: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5bc0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5bd0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5be0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5bf0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5c00: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5c30: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5c50: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5c70: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5c90: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5cb0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5cc0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5cd0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5ce0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5cf0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5d00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d10: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5d20: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5d30: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5d40: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5d50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5d60: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5d70: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5d80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5d90: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5da0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5dc0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5dd0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5de0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5df0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e10: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
5e20: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5e30: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
5e40: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5e50: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5e60: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5e70: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5e80: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
5e90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5ea0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
5eb0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
5ec0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
5ed0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
5ee0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5ef0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5f00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5f10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5f20: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5f30: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5f40: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5f50: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5f60: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5f70: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5f80: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
5f90: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fa0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
5fb0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
5fc0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fd0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
5fe0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
5ff0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6000: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6010: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6020: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6030: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6040: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6050: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6060: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6070: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6080: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
60b0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
60c0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
60d0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
60e0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
60f0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6100: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6110: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6120: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6130: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6140: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6170: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6180: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
61a0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61b0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
61c0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
61d0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
61e0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
61f0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6200: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6210: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6220: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6230: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6240: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6250: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6270: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6280: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6290: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
62a0: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
62b0: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
62c0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
62d0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
62e0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
62f0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6300: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6310: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6320: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6330: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6340: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6350: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6360: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6370: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6380: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6390: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
63a0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
63b0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
63c0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
63d0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
63e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
63f0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6400: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6410: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6420: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6430: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6440: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6450: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6460: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6470: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6480: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6490: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
64a0: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
64b0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
64c0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
64d0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
64e0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
64f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6500: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6510: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6520: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6530: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6540: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6550: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6560: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6580: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6590: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
65a0: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
65b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
65c0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
65d0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
65e0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
65f0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6600: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6610: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6620: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6650: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6660: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6670: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6680: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6690: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
66a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
66b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
66c0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
66d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
66e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
66f0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6700: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6720: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6730: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6740: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6750: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6760: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6770: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6780: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6790: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
67a0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
67b0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
67c0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
67d0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
67e0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
67f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6800: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6810: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6820: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6830: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6840: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6850: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6860: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6870: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6880: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6890: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
68a0: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
68b0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
68c0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
68d0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
68e0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
68f0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6900: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6910: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6920: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6940: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6950: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6960: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6970: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6980: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6990: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
69a0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
69b0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
69c0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
69d0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
69e0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
69f0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6a00: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6a10: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6a20: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6a30: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6a50: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6a60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6a70: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6a80: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6a90: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6aa0: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6ab0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ac0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6ad0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6ae0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6af0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6b00: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6b10: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6b20: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b40: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6b50: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6b60: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6b70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6b80: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6b90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6ba0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6bb0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6bc0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6bd0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6be0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6c00: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6c10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6c20: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6c30: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6c40: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6c50: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6c60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6c80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6c90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6ca0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6cc0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6cd0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6ce0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cf0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6d00: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6d10: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6d20: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6d30: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6d40: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6d50: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6d60: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6d70: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6d80: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6d90: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6da0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6db0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6dc0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6dd0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6de0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6df0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6e00: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6e10: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
6e20: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
6e30: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
6e40: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
6e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6e60: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
6e70: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6e80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6e90: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6ea0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
6eb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6ec0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
6ed0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
6ee0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
6ef0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
6f00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
6f10: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
6f20: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
6f30: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
6f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6f50: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
6f60: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
6f70: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
6f80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6f90: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
6fa0: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
6fb0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
6fc0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
6fd0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
6fe0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
6ff0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7000: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7010: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7020: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7030: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7040: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7050: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7060: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7070: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7080: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7090: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
70a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
70b0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
70c0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
70d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
70e0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
70f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7100: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7110: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7120: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7130: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7140: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7150: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7160: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7170: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7180: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7190: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
71a0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
71b0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
71c0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
71d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
71e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
71f0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7200: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7210: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7220: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7230: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7240: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7250: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7260: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7270: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7280: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7290: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
72a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
72b0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
72c0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
72d0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
72e0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
72f0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7300: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7310: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7320: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7330: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7340: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7350: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7360: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7370: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7380: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7390: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
73a0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
73b0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
73c0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
73d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
73e0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
73f0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7400: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7430: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7450: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7460: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7470: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7480: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74b0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
74c0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
74d0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
74e0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
74f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7500: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7510: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7530: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7540: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7550: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7560: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7570: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7580: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7590: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
75a0: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
75b0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
75c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
75d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
75e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7600: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7610: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7620: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7630: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7640: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7650: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7660: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7670: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7680: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7690: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
76a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
76b0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
76c0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
76d0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
76e0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
76f0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7700: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7710: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7720: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7730: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7740: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7750: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7760: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7770: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7780: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7790: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
77a0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
77b0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
77c0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
77d0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
77e0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
77f0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
7800: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
7820: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
7830: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
7840: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
7850: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7860: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
7870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
7880: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
7890: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
78a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
78b0: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
78c0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
78d0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
78e0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
78f0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
7900: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7910: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
7920: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
7930: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7940: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7950: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7960: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7970: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7980: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
7990: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
79a0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
79b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
79c0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
79d0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
79e0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
79f0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
7a00: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7a10: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7a20: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
7a30: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
7a40: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
7a50: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7a60: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
7a70: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
7a80: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
7a90: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
7aa0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
7ab0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
7ac0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
7ad0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
7ae0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
7b00: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
7b10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
7b20: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
7b30: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
7b40: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
7b50: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
7b60: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
7b70: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
7b80: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
7b90: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
7ba0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
7bb0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
7bc0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7bd0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7be0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
7bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c00: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
7c10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7c20: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
7c30: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
7c40: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
7c50: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
7c60: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
7c70: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
7c80: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7c90: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
7ca0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
7cb0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
7cc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
7cd0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7ce0: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
7cf0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
7d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7d10: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
7d20: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
7d30: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
7d40: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
7d50: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
7d60: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
7d70: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
7d80: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
7d90: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
7da0: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
7db0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
7dc0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
7dd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
7de0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
7e00: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
7e10: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
7e20: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
7e30: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
7e40: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
7e50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7e60: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
7e70: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
7e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7e90: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
7ea0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
7eb0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
7ec0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
7ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7ee0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
7ef0: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
7f00: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
7f10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  }.../*.** Unlock
7f20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7f30: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
7f40: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7f50: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7f60: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7f70: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
7f80: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
7f90: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
7fa0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
7fb0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7fc0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7fd0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7fe0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7ff0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
8000: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
8010: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
8020: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
8030: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
8040: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8050: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8060: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
8070: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
8080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
8090: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
80a0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
80b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
80c0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
80d0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
80e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74   }.  pPager->pSt
80f0: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  mt = 0;.  pPager
8100: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
8110: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8120: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
8130: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
8140: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
8150: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  0;.  pPager->nHa
8160: 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sh = 0;.  sqlite
8170: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
8180: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
8190: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
81a0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
81b0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
81c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
81d0: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
81e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
81f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
8200: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
8210: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
8220: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
8230: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
8240: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
8250: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
8260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8270: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
8280: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
8290: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
82a0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
82b0: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
82c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
82d0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
82e0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
82f0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
8300: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
8310: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
8320: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
8330: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
8340: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
8350: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
8360: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
8370: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
8380: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
8390: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
83a0: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
83b0: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
83c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
83d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
83e0: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
83f0: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
8400: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
8410: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
8420: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
8430: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
8440: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
8450: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
8460: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8470: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
8480: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
8490: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
84a0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
84b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
84d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
84e0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
84f0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8510: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
8520: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
8530: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
8540: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
8550: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
8560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8570: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
8580: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
8590: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
85a0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
85b0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
85c0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
85d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
85e0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
85f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
8600: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8620: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
8630: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8640: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20  veMode .        
8650: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
8660: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
8670: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
8680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20  QLITE_OK ){;.   
8690: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
86a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
86b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
86c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
86d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
86e0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
86f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8700: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8710: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
8720: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8730: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
8740: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
8750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8760: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8770: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
8780: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  zJournal);.     
8790: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
87a0: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
87b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
87c0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
87d0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
87e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
87f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8800: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8810: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
8820: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
8830: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
8840: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8850: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
8860: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
8870: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
8880: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8890: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
88a0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
88b0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
88c0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
88d0: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
88e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
88f0: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
8900: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
8910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
8920: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
8930: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
8940: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8950: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8960: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8970: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8980: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
8990: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
89a0: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  ){.    rc2 = sql
89b0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
89c0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
89d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
89e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
89f0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
8a00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8a10: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
8a20: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8a30: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
8a40: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
8a50: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8a60: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
8a70: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
8a80: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8a90: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
8aa0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
8ab0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
8ac0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
8ad0: 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72  e = -1;..  retur
8ae0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
8af0: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
8b00: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8b10: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
8b20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8b30: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8b40: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8b50: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8b60: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8b70: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8b80: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8b90: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8ba0: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8bb0: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8bc0: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
8bd0: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8be0: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8bf0: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8c00: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8c10: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
8c20: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8c30: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8c40: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8c50: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8c60: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8c70: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8c80: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8c90: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8ca0: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8cb0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8cc0: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8cd0: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8ce0: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8cf0: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8d00: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8d10: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8d20: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8d30: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8d40: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8d50: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8d60: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8d70: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8d80: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8d90: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
8da0: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
8db0: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
8dc0: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
8dd0: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
8de0: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
8df0: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
8e00: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
8e10: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
8e20: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
8e30: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
8e40: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
8e50: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
8e60: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
8e70: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
8e80: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
8e90: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
8ea0: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
8eb0: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
8ec0: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
8ed0: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
8ee0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
8ef0: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
8f00: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
8f10: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8f20: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
8f30: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
8f40: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
8f50: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
8f60: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
8f70: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8f80: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8f90: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8fa0: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8fb0: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8fc0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8fd0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
8fe0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
8ff0: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
9000: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
9010: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
9020: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
9030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
9040: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
9050: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
9060: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
9070: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
9080: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
9090: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
90a0: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
90b0: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
90c0: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
90d0: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
90e0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
90f0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
9100: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
9110: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
9120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
9130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9140: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
9150: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
9160: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
9170: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
9180: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
9190: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
91b0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
91c0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
91d0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
9200: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
9210: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
9220: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9240: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
9250: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
9260: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
9270: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
9280: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
9290: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
92a0: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
92b0: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
92c0: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
92d0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
92e0: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
92f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9300: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
9310: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
9320: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9330: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
9340: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
9350: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
9360: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
9370: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
9380: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9390: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
93a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
93b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
93c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
93d0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
93e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
93f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9410: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
9420: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
9430: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
9440: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
9450: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
9460: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
9470: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
9480: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
9490: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
94a0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
94b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
94c0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
94d0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
94e0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
94f0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
9500: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
9510: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
9520: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
9530: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
9540: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
9550: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
9560: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
9570: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
9580: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
9590: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
95a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
95b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
95c0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
95d0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
95e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
95f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9600: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
9610: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
9620: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
9630: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
9650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9660: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
9670: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
9680: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
9690: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
96a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
96b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
96c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
96e0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
96f0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9700: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
9710: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9720: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9730: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
9740: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
9750: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
9760: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
9770: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
9780: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
9790: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
97a0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
97b0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
97c0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
97d0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
97e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
97f0: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
9800: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
9810: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
9820: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
9830: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
9840: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9850: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
9860: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
9870: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
9880: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
9890: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
98a0: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
98b0: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
98c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
98d0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
98e0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
98f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9900: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
9910: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
9920: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
9930: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9940: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
9950: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
9960: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
9970: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
9980: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
9990: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
99a0: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
99b0: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
99c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
99d0: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
99e0: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
99f0: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
9a00: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e   contents are in
9a10: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
9a20: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
9a30: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20    Otherwise, if 
9a40: 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  a full ROLLBACK 
9a50: 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
9a60: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9a70: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c  rollback the ful
9a80: 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20  l ROLLBACK will 
9a90: 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20  not restore the 
9aa0: 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67  page to its orig
9ab0: 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  inal.  ** conten
9ac0: 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  t.  Two conditio
9ad0: 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62  ns must be met b
9ae0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
9af0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
9b00: 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  ** files. (1) th
9b10: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
9b20: 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  be locked.  (2) 
9b30: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
9b40: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70   original.  ** p
9b50: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69  age content is i
9b60: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
9b70: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
9b80: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
9b90: 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  t in.  ** cache 
9ba0: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61  or else it is ma
9bb0: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
9bc0: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
9bd0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
9be0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9c00: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9c10: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30  LUSIVE || pPg!=0
9c20: 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
9c30: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9c40: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9c50: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9c60: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9c70: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9c80: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
9c90: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
9ca0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9cb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9cc0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9cd0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9ce0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9cf0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9d00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9d10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9d20: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9d30: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9d40: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9d50: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9d60: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9d70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9d80: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
9d90: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
9da0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
9db0: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
9dc0: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
9dd0: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9de0: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9df0: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9e00: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9e10: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9e20: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9e30: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9e40: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
9e50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9e60: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
9e70: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
9e80: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
9e90: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
9ea0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9eb0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9ec0: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
9ed0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
9ee0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
9ef0: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
9f00: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
9f10: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
9f20: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
9f30: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
9f40: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9f50: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9f60: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
9f70: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
9f80: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
9f90: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
9fa0: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
9fb0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
9fc0: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
9fd0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
9fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
9ff0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a000: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a010: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a020: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
a030: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
a040: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
a050: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a060: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a070: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a080: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43  alue of Pager.iC
a090: 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20  hangeCount */.  
a0a0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
a0b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  .      pPager->i
a0c0: 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
a0d0: 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
a0e0: 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 24);.    }.  }
a0f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a100: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
a110: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
a120: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
a130: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
a140: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
a150: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
a160: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
a170: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a180: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
a190: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
a1a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
a1b0: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
a1c0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
a1d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a1e0: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
a1f0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
a200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a210: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
a220: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
a230: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
a240: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
a250: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
a260: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a270: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a280: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a290: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a2a0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a2b0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a2c0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a2d0: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a2e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a2f0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a300: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a310: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a320: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a330: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a340: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a350: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a360: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a370: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a380: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a390: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a3a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a3b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a3c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a3d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a3e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a3f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a400: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a410: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a420: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a430: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a440: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a450: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a460: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a470: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a480: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a490: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a4a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a4b0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a4c0: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
a4d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a4e0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a4f0: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
a500: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
a510: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a520: 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  ze(master, &nMas
a530: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
a540: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a550: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a560: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
a570: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
a580: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
a590: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
a5a0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
a5b0: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
a5c0: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
a5d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
a5e0: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
a5f0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
a600: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
a610: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
a620: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
a630: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
a640: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
a650: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
a660: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a670: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
a680: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
a690: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a6a0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
a6b0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a6c0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
a6d0: 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65  ite3OsRead(maste
a6e0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
a6f0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
a700: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
a710: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a720: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a730: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
a740: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
a750: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
a760: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
a770: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
a780: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
a790: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
a7a0: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
a7b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
a7c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
a7d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
a7e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a7f0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
a800: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
a810: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
a820: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
a830: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
a840: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
a850: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
a860: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
a870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
a880: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a890: 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c   OsFile *journal
a8a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
a8b0: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  t c;..        rc
a8c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a8d0: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
a8e0: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
a8f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a910: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a920: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a930: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
a940: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
a950: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
a960: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a970: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a980: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
a990: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a9a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a9b0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a9c0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a9d0: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
a9e0: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
a9f0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
aa00: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
aa10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
aa20: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
aa30: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
aa40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
aa50: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
aa60: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
aa70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
aa80: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
aa90: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
aaa0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
aab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
aac0: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
aad0: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
aae0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
aaf0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ab00: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
ab10: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
ab20: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
ab30: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
ab40: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
ab50: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
ab60: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
ab70: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ab80: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
ab90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
aba0: 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61  ..#if 0./*.** Ma
abb0: 6b 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e  ke every page in
abc0: 20 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65   the cache agree
abd0: 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
abe0: 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72   disk.  In other
abf0: 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61   words,.** rerea
ac00: 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65  d the disk to re
ac10: 73 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66  set the state of
ac20: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
ac30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
ac40: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
ac50: 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69   rollback in whi
ac60: 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64  ch some of the d
ac70: 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61  irty cache.** pa
ac80: 67 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65  ges had never be
ac90: 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  en written out t
aca0: 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64  o disk.  We need
acb0: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
acc0: 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65  e.** cache conte
acd0: 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65  nt and the easie
ace0: 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61  st way to do tha
acf0: 74 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74  t is to reread t
ad00: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a  he old content.*
ad10: 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  * back from the 
ad20: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
ad30: 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  int pager_reload
ad40: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
ad50: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
ad60: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
ad70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72  SQLITE_OK;.  for
ad80: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
ad90: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
ada0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
adb0: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 70 50 61  char *zBuf = pPa
adc0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
add0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
ade0: 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e 65 20 70  torage for one p
adf0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  age */.    if( !
ae00: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
ae10: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
ae20: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
ae30: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
ae40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
ae50: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
ae60: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
ae70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
ae80: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
ae90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
aea0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
aeb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
aec0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
aed0: 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
aee0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
aef0: 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
af00: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
af10: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
af20: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
af30: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
af40: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
af50: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
af60: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
af70: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
af80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
af90: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61  set(zBuf, 0, pPa
afa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
afb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
afc0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
afd0: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
afe0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
aff0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
b000: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
b010: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b020: 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  Pg), zBuf, pPage
b030: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
b040: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b050: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
b060: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
b070: 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67  initer(pPg, pPag
b080: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b0a0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b0b0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
b0c0: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
b0d0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
b0e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
b0f0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
b100: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
b110: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
b120: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
b130: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
b140: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
b150: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
b160: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69   }.  pPager->pDi
b170: 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  rty = 0;.  retur
b180: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
b190: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
b1a0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
b1b0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
b1c0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
b1d0: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
b1e0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
b1f0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
b200: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
b210: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61   int nPage){.  a
b220: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
b230: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
b240: 55 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72  USIVE );.  retur
b250: 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  n sqlite3OsTrunc
b260: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
b270: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b280: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
b290: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
b2a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
b2b0: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
b2c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b2d0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
b2e0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
b2f0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
b300: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
b310: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
b320: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
b330: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
b340: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
b350: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
b360: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
b370: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
b380: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b390: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b3a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
b3b0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
b3c0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
b3d0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
b3e0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b3f0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
b400: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
b410: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
b420: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
b430: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
b440: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
b450: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b460: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
b470: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
b480: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
b490: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
b4a0: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
b4b0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b4c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b4d0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
b4e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
b4f0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
b500: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
b510: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
b520: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b530: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b540: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
b550: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
b560: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
b570: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
b580: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
b590: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
b5a0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
b5b0: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
b5c0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
b5d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
b5e0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
b5f0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
b600: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
b610: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
b620: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
b630: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
b640: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
b650: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
b660: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
b670: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b680: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
b690: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
b6a0: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
b6b0: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
b6c0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
b6d0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
b6e0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
b6f0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
b700: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
b710: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
b720: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
b730: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
b740: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
b750: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
b760: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
b770: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
b780: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
b790: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
b7a0: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
b7b0: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
b7c0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
b7d0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
b7e0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
b7f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
b800: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
b810: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
b820: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
b830: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
b840: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
b850: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b860: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
b870: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
b880: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
b890: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
b8a0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b8b0: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
b8c0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
b8d0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
b8e0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
b8f0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
b900: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
b910: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
b920: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b930: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
b940: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
b950: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
b960: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
b970: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
b980: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
b990: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
b9a0: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
b9b0: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
b9c0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
b9d0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
b9e0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
b9f0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
ba00: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
ba10: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
ba20: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
ba30: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
ba40: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
ba50: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
ba60: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
ba70: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
ba80: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
ba90: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
baa0: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
bab0: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
bac0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
bad0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
bae0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
baf0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
bb00: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
bb10: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
bb20: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
bb30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
bb40: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
bb50: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
bb60: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
bb70: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
bb80: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
bb90: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
bba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bbb0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
bbc0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
bbd0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
bbe0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
bbf0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
bc00: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
bc10: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
bc20: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
bc30: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
bc40: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
bc50: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
bc60: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
bc70: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
bc80: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
bc90: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
bca0: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
bcb0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
bcc0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
bcd0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
bce0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
bcf0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
bd00: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
bd10: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bd20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bd30: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
bd40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bd50: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36  int isHot){.  i6
bd60: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
bd70: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bd80: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bd90: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
bda0: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
bdb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bdc0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
bdd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
bde0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
be00: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
be10: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
be20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
be30: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
be40: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
be50: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be70: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
be80: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
be90: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
bea0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
beb0: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
bec0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
bed0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
bee0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
bef0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
bf00: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
bf10: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
bf20: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
bf30: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
bf40: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bf50: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
bf60: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
bf70: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
bf80: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
bf90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
bfa0: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
bfb0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
bfc0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
bfd0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bfe0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
bff0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
c000: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
c010: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c020: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c030: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
c040: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
c050: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
c060: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
c070: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
c080: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
c090: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
c0a0: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
c0b0: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
c0c0: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
c0d0: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
c0e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
c0f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c100: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c110: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
c120: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
c130: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
c140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
c150: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
c160: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
c170: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c180: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
c190: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
c1a0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c1b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
c1c0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
c1d0: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
c1e0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
c1f0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
c200: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
c210: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
c220: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
c230: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
c240: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
c250: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
c260: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
c270: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
c280: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
c290: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
c2a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
c2b0: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
c2c0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
c2d0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
c2e0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
c2f0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
c300: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
c310: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
c320: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
c330: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
c340: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
c350: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
c360: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
c370: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
c380: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
c390: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
c3a0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
c3b0: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
c3c0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
c3d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
c3e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c3f0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c400: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c410: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c420: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c430: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
c440: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
c450: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
c460: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
c470: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c480: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
c490: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
c4a0: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
c4b0: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
c4c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
c4d0: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
c4e0: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
c4f0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
c500: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
c510: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
c520: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
c530: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
c540: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
c550: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
c560: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
c570: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c580: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
c590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c5a0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
c5b0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
c5c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c5d0: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
c5e0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c5f0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
c600: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
c610: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
c620: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
c630: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
c640: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74  ** process. In t
c650: 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73  his case the res
c660: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c670: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
c680: 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  f.    ** journal
c690: 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61  led copies of pa
c6a0: 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
c6b0: 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e   be read back in
c6c0: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  to the cache..  
c6d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c6e0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29  c==0 && !isHot )
c6f0: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
c700: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
c710: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
c720: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c730: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c740: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
c750: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
c760: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
c770: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
c780: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
c790: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
c7a0: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
c7b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c7c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
c7d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
c7e0: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
c7f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
c800: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c810: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
c820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c830: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
c840: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c850: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
c860: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
c870: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
c880: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
c890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c8a0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
c8b0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c8c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
c8d0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
c8e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
c8f0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c900: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
c910: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
c920: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
c930: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
c940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
c950: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
c960: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c970: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c980: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
c990: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
c9a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c9b0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c9c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
c9d0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
c9e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
c9f0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ca00: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
ca10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ca20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ca30: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
ca40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
ca50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ca60: 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
ca70: 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
ca80: 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
ca90: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
caa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cab0: 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
cac0: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
cad0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
cae0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
caf0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
cb00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
cb10: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
cb20: 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
cb30: 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
cb40: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
cb50: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
cb60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
cb70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
cb80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cb90: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
cba0: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
cbb0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
cbc0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
cbd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
cbe0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
cbf0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
cc00: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
cc10: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
cc20: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
cc30: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
cc40: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
cc50: 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
cc60: 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
cc70: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
cc80: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
cc90: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
cca0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
ccb0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
ccc0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
ccd0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
cce0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ccf0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
cd00: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cd10: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
cd20: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
cd30: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
cd40: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cd50: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
cd60: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
cd70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
cd80: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
cd90: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
cda0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
cdb0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
cdc0: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
cdd0: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
cde0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
cdf0: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
ce00: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
ce10: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
ce20: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
ce30: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
ce40: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
ce50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
ce60: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
ce70: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
ce80: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
ce90: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
cea0: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
ceb0: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
cec0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
ced0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
cee0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
cef0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
cf00: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
cf10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cf20: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
cf30: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
cf40: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
cf50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cf60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
cf70: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
cf80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
cf90: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cfa0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
cfb0: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
cfc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
cfd0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
cfe0: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
cff0: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
d000: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d010: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
d020: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
d030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
d040: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
d050: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
d060: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d070: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
d080: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
d090: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65  just after the e
d0a0: 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a  nd of the last j
d0b0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  ournal.  ** page
d0c0: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
d0d0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
d0e0: 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69  l-header for thi
d0f0: 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  s statement.  **
d100: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
d110: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65   written, or the
d120: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
d130: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
d140: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
d150: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
d160: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
d170: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
d180: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
d190: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
d1a0: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
d1b0: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
d1c0: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
d1d0: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
d1e0: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
d1f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d200: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
d210: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d220: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
d230: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d240: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d250: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
d260: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
d270: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d280: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d290: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d2a0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
d2b0: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
d2c0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
d2d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
d2e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d2f0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
d300: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d310: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
d320: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d330: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
d340: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
d350: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
d360: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
d370: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
d380: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d390: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d3a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
d3b0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
d3c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
d3d0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
d3e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
d3f0: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
d400: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
d410: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
d420: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
d430: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
d440: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
d450: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
d460: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
d470: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
d480: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d490: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d4a0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d4b0: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
d4c0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d4d0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d4e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d4f0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d500: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d510: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
d520: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
d530: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
d540: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
d550: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
d560: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
d570: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d580: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
d590: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
d5a0: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
d5b0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
d5c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d5d0: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
d5e0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d5f0: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
d600: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
d610: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
d620: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
d630: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
d640: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
d650: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d660: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
d670: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
d680: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
d690: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d6a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d6b0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d6c0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d6d0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
d6e0: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d6f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d700: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d710: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
d720: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d730: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
d740: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
d750: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
d760: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
d770: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d780: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d790: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
d7a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d7b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d7c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d7d0: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
d7e0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d7f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d800: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d810: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d820: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
d830: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d840: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
d850: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
d860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d870: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
d880: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
d890: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d8a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d8b0: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
d8c0: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
d8d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d8e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d8f0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d900: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
d910: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d920: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
d930: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
d940: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
d950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d960: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
d970: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
d980: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
d990: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
d9a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d9b0: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
d9c0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d9d0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d9e0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d9f0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
da00: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
da10: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
da20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
da30: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
da40: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
da50: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
da60: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
da70: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
da80: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
da90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
daa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dab0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dac0: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
dad0: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
dae0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
daf0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
db00: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
db10: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
db20: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
db30: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
db40: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
db50: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
db60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
db70: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
db80: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
db90: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
dba0: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
dbb0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
dbc0: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
dbd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
dbe0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
dbf0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
dc00: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
dc10: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
dc20: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
dc30: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
dc40: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
dc50: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
dc60: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
dc70: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
dc80: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
dc90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
dca0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
dcb0: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
dcc0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
dcd0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
dce0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
dcf0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
dd00: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
dd10: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
dd20: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
dd30: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
dd40: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dd50: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dd60: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
dd70: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
dd80: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
dd90: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
ddb0: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
ddc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
ddd0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
dde0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ddf0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
de00: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
de10: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
de20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
de30: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
de40: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
de50: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
de60: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
de80: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
de90: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
dea0: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
deb0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
dec0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
ded0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dee0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
def0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
df00: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
df10: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
df20: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
df30: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
df40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
df50: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
df60: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
df70: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
df80: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
df90: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
dfa0: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
dfb0: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
dfc0: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
dfd0: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
dfe0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
dff0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
e000: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
e010: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
e020: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e030: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
e040: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
e050: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
e060: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
e070: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
e080: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
e090: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
e0a0: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
e0b0: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
e0c0: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
e0d0: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
e0e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
e0f0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
e100: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e110: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
e120: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
e130: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
e140: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
e150: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
e160: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
e170: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
e180: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
e190: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
e1a0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
e1b0: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
e1c0: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
e1d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e1e0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
e1f0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
e200: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
e210: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
e220: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
e230: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
e240: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
e250: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
e260: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e270: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
e280: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
e290: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
e2a0: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
e2b0: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
e2c0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
e2d0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e2e0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
e2f0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
e300: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
e310: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
e320: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e330: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
e340: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e350: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
e360: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
e370: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
e380: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
e390: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e3a0: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
e3b0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
e3c0: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
e3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
e3e0: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
e3f0: 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a  (OsFile **pFd){.
e400: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
e410: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e420: 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
e430: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69  PNAME_SIZE];..#i
e440: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e450: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
e460: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
e470: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e480: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e490: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
e4a0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
e4b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
e4c0: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
e4d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e4e0: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e4f0: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
e500: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e510: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e520: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e530: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e550: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e560: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e570: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e580: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e590: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e5a0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e5b0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e5c0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e5d0: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e5e0: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e5f0: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e600: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e610: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e620: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e630: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e640: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e650: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e660: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e670: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e680: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e690: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e6a0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e6b0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e6c0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e6d0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e6e0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e6f0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e700: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e710: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e720: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e730: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e740: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e750: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e760: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e770: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e780: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e790: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
e7a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
e7b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e7c0: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
e7d0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
e7e0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
e7f0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
e800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e810: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
e820: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
e830: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
e840: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
e850: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
e860: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
e870: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
e880: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
e890: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8b0: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
e8c0: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
e8d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e8e0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
e8f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
e900: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
e910: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
e920: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
e930: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
e940: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
e950: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20  .  OsFile *fd = 
e960: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
e970: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
e980: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
e990: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
e9a0: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
e9b0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
e9c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
e9d0: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
e9e0: 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
e9f0: 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
ea00: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
ea10: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
ea20: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
ea30: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
ea40: 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  IZE];.#ifdef SQL
ea50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
ea60: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
ea70: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
ea80: 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
ea90: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
eaa0: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
eab0: 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
eac0: 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
ead0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
eae0: 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
eaf0: 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
eb00: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
eb10: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
eb20: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
eb30: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
eb40: 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
eb50: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
eb60: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
eb70: 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f  an be set. It wo
eb80: 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61  uld be nice to a
eb90: 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20  ssert.  ** that 
eba0: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
ebb0: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62  c is non-zero, b
ebc0: 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65  ut alas this bre
ebd0: 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a  aks test cases .
ebe0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
ebf0: 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72  invoke the pager
ec00: 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a   directly..  */.
ec10: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
ec20: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
ec30: 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
ec40: 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64  rt( pTsd );.#end
ec50: 69 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64  if..  /* We used
ec60: 20 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c   to test if mall
ec70: 6f 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79  oc() had already
ec80: 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70   failed before p
ec90: 72 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a  roceeding. .  **
eca0: 20 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69   But the way thi
ecb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
ecc0: 65 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61  ed in SQLite mea
ecd0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65  ns that can neve
ece0: 72 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46  r.  ** happen. F
ecf0: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74  urthermore, if t
ed00: 68 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  he malloc-failed
ed10: 20 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79   flag is already
ed20: 20 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68   set, .  ** eith
ed30: 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
ed40: 71 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72  qliteStrDup() or
ed50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
ed60: 62 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20  below will.  ** 
ed70: 66 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64  fail shortly and
ed80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65   SQLITE_NOMEM re
ed90: 74 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20  turned anyway.. 
eda0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
edb0: 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   0;..  /* Open t
edc0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
edd0: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
ede0: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
edf0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
ee00: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
ee10: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
ee20: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
ee30: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
ee40: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
ee50: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
ee60: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
ee70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ee80: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
ee90: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
eea0: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
eeb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
eec0: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
eed0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
eee0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
eef0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
ef00: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
ef10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ef20: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ef30: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
ef40: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
ef50: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ef60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ef70: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
ef80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
ef90: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
efa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
efb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
efc0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
efd0: 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73  temp(&fd);.    s
efe0: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
eff0: 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Name(zTemp);.   
f000: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
f010: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
f020: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
f030: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
f040: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
f050: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f060: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
f070: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
f080: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f090: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f0a0: 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20  ure. As part of 
f0b0: 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74  the same allocat
f0c0: 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ion, allocate.  
f0d0: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
f0e0: 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74   full paths of t
f0f0: 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f  he file, directo
f100: 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a  ry and journal .
f110: 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c    ** (Pager.zFil
f120: 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69  ename, Pager.zDi
f130: 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65  rectory and Page
f140: 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a  r.zJournal)..  *
f150: 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74  /.  if( zFullPat
f160: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d  hname ){.    nam
f170: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
f180: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f190: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
f1a0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
f1b0: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
f1c0: 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20  en*3 + 30 );.   
f1d0: 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72   if( pPager && r
f1e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f1f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
f200: 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20  mpSpace = (char 
f210: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  *)sqliteMallocRa
f220: 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  w(SQLITE_DEFAULT
f230: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
f240: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
f250: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
f260: 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
f270: 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
f280: 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79   free the memory
f290: 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74   .  ** pointed t
f2a0: 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61  o by zFullPathna
f2b0: 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67  me, free the Pag
f2c0: 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
f2d0: 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a   close the .  **
f2e0: 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65   file. Since the
f2f0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
f300: 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
f310: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
f320: 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
f330: 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
f340: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
f350: 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50  Pager || !zFullP
f360: 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67  athname || !pPag
f370: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c  er->pTmpSpace ||
f380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f390: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
f3a0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
f3b0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
f3c0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  athname);.    sq
f3d0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
f3e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
f3f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
f400: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
f410: 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
f420: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
f430: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
f440: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
f450: 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
f460: 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
f470: 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74  pPager, zFullPat
f480: 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72  hname)).  pPager
f490: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
f4a0: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
f4b0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
f4c0: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
f4d0: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
f4e0: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
f4f0: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
f500: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f510: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
f520: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
f530: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
f540: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
f550: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
f560: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
f570: 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61  me);..  for(i=na
f580: 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50  meLen; i>0 && pP
f590: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
f5a0: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
f5b0: 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
f5c0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f5d0: 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74  y[i-1] = 0;.  st
f5e0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
f5f0: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
f600: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
f610: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f620: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
f630: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
f640: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
f650: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
f660: 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50  fd = fd;.  /* pP
f670: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f680: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
f690: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
f6a0: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
f6b0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f6c0: 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
f6d0: 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
f6e0: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f6f0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
f700: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f710: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
f720: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f730: 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
f740: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f750: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
f760: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
f770: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
f780: 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61  E_SIZE;.  /* pPa
f790: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
f7a0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f7b0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
f7c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f7d0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
f7e0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61    /* pPager->nMa
f7f0: 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  xPage = 0; */.  
f800: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
f810: 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20   100;.  assert( 
f820: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20  PAGER_UNLOCK==0 
f830: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
f840: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
f850: 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  LOCK; */.  /* pP
f860: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
f870: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
f880: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
f890: 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
f8a0: 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
f8b0: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
f8c0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
f8d0: 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
f8e0: 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
f8f0: 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
f900: 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
f910: 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
f920: 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
f930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74  xclusiveMode = t
f940: 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
f950: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
f960: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
f970: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
f980: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
f990: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
f9a0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
f9b0: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
f9c0: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
f9d0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
f9e0: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
f9f0: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
fa00: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
fa10: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
fa20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
fa30: 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
fa40: 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
fa50: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
fa60: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
fa70: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
fa80: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c  a);.  assert(fd|
fa90: 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21  |memDb);.  if( !
faa0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
fab0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
fac0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
fad0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20  rSize(fd);.  }. 
fae0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
faf0: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
fb00: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
fb10: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
fb20: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
fb30: 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
fb40: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fb50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fb60: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
fb70: 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
fb80: 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50  pNext = pTsd->pP
fb90: 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50  ager;.  pTsd->pP
fba0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fbb0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
fbc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fbd0: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
fbe0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
fbf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fc00: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
fc10: 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
fc20: 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
fc30: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
fc40: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
fc50: 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
fc60: 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
fc70: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
fc80: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
fc90: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
fca0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
fcb0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
fcc0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
fcd0: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
fce0: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
fcf0: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
fd00: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
fd10: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
fd20: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
fd30: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
fd40: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
fd50: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
fd60: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
fd70: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
fd80: 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
fd90: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
fda0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
fdb0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
fdc0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
fdd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fde0: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
fdf0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
fe00: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
fe10: 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
fe20: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
fe30: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
fe40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
fe50: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
fe60: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
fe70: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
fe80: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
fe90: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
fea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
feb0: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
fec0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
fed0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
fee0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
fef0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
ff00: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
ff10: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
ff20: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
ff30: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
ff40: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
ff50: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
ff60: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
ff70: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
ff80: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
ff90: 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
ffa0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
ffb0: 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
ffc0: 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
ffd0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
ffe0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
fff0: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
10000 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
10010 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
10020 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
10030 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
10040 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
10050 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
10060 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
10070 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
10080 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
10090 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
100a0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
100b0 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
100c0 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
100d0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
100e0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
100f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10100 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
10110 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
10120 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
10130 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
10140 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
10150 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
10160 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  geSize;.    pPag
10170 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
10180 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72  sqlite3ReallocOr
10190 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
101a0 70 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65  pSpace, pageSize
101b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
101c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
101d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
101e0 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
101f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10200 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
10210 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
10220 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
10230 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
10240 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
10250 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
10260 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
10270 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
10280 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
10290 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
102a0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
102b0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
102c0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
102d0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
102e0 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
102f0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
10300 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
10310 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10320 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
10330 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
10340 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
10350 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
10360 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f  cnt;.void clear_
10370 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10380 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  or(){.  sqlite3_
10390 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30  io_error_hit = 0
103a0 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  ;.}.void disable
103b0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
103c0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
103d0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
103e0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
103f0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
10400 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10410 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
10420 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10430 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
10440 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10450 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
10460 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
10470 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d  define clear_sim
10480 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
10490 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  ).# define disab
104a0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
104b0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
104c0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
104d0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
104e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
104f0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
10500 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10510 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10520 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10530 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
10540 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
10550 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
10560 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
10570 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
10580 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
10590 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
105a0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
105b0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
105c0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
105d0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
105e0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
105f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
10600 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10610 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10620 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10630 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
10640 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
10650 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
10660 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
10670 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
10680 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
10690 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
106a0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
106b0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
106c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
106d0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
106e0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
106f0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
10700 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10710 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10720 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10730 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
10740 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
10750 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
10760 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
10780 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
10790 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
107a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
107b0 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
107c0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
107d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
107e0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
107f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
10800 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10820 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10830 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10860 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10870 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10880 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
10890 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
108a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
108b0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
108c0 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
108d0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
108e0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
108f0 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
10900 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10910 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10920 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10930 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10940 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10950 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10960 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10970 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10980 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
10990 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
109a0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
109b0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
109c0 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
109d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
109e0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
109f0 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10a00 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10a10 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10a20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10a30 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10a40 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10a50 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10a60 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10a70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10a80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
10a90 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
10aa0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
10ab0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
10ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
10ad0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
10ae0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10af0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10b00 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10b10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10b20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10b40 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10b50 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10b60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10b70 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10b80 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10b90 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
10ba0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
10bb0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
10bc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10bd0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
10be0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10bf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10c00 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10c10 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10c20 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10c30 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10c40 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10c50 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10c60 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10c70 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10c80 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
10c90 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
10ca0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
10cb0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
10cc0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
10cd0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
10ce0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10cf0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10d00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10d10 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10d20 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10d30 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10d40 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10d50 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10d60 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10d70 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10d80 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10d90 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10da0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10db0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10dc0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
10dd0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
10de0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
10df0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
10e00 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
10e10 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
10e20 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
10e30 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
10e40 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10e50 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
10e60 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
10e70 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10e80 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
10e90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
10ea0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
10eb0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
10ec0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
10ed0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10ee0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
10ef0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
10f00 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
10f10 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
10f20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10f30 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
10f40 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10f50 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
10f60 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
10f70 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
10f80 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
10f90 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
10fa0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
10fb0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
10fc0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
10fd0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
10fe0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10ff0 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
11000 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
11010 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
11020 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
11030 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
11040 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
11050 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
11060 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
11070 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
11080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
11090 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
110a0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
110b0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
110c0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
110d0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
110e0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
110f0 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
11100 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
11110 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11120 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
11130 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
11140 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
11150 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
11160 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
11170 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
11180 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
11190 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
111a0 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
111b0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
111c0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
111d0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
111e0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
111f0 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
11210 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11220 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
11230 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
11240 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
11250 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
11260 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
11270 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
11280 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
11290 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
112a0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
112b0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
112c0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
112d0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
112e0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
112f0 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
11300 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11310 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11320 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11330 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11340 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
11350 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
11360 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11370 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
11380 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
11390 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
113a0 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
113b0 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
113c0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
113d0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
113e0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
113f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11400 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
11410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11420 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
11430 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
11440 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
11450 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
11460 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
11470 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
11480 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
11490 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
114a0 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
114b0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
114c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
114d0 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
114e0 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
114f0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11500 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11510 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11520 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11530 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
11540 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
11550 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
11560 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
11570 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
11580 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
11590 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
115a0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
115b0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
115c0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
115d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
115e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
115f0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
11600 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11610 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11620 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11630 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
11640 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11650 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
11660 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
11670 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
11680 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
11690 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
116a0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
116b0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
116c0 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
116d0 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
116e0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
116f0 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
11700 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
11710 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
11720 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
11730 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
11740 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
11750 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
11760 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
11770 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
11780 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
11790 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
117a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
117b0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
117c0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
117d0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
117e0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
117f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
11800 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
11810 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
11820 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
11830 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
11840 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
11850 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11860 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
11870 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
11880 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
11890 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
118a0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
118b0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
118c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
118d0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
118e0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
118f0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
11900 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
11910 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
11920 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
11930 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
11940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11950 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11960 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
11970 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
11980 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
11990 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
119a0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
119b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
119c0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
119d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
119e0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
119f0 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
11a00 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11a10 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
11a20 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
11a30 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
11a40 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
11a50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
11a70 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
11a80 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
11a90 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
11aa0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
11ab0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
11ac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
11ae0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
11af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11b00 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
11b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11b20 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
11b30 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11b40 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
11b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11b60 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11b70 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
11b80 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11b90 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11ba0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11bb0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11bc0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
11bd0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
11be0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
11bf0 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
11c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
11c10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11c20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
11c30 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
11c40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11c50 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
11c60 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
11c70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11c80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
11c90 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
11ca0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
11cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11cc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11cd0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
11ce0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
11cf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
11d00 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
11d10 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
11d20 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11d30 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
11d40 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
11d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11d70 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
11d80 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11d90 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
11da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11db0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
11dc0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
11dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11de0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
11df0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
11e00 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
11e10 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
11e20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
11e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11e40 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
11e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11e60 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
11e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11e80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
11e90 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
11ea0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
11eb0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
11ec0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
11ed0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
11ee0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
11ef0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
11f00 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
11f10 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
11f20 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
11f30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
11f40 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
11f50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
11f60 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
11f70 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
11f80 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
11f90 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
11fa0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
11fb0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
11fc0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11fd0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
11fe0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
11ff0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
12000 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
12010 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
12020 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
12030 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
12040 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
12050 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
12060 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12070 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
12080 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
12090 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
120a0 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
120b0 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
120c0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
120d0 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
120e0 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
120f0 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
12100 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
12110 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
12120 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
12130 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
12140 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
12150 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
12160 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
12170 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
12180 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
12190 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54  be set..  */.  T
121a0 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
121b0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
121c0 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
121d0 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73   pPager );.  ass
121e0 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73  ert( pTsd && pTs
121f0 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e  d->nAlloc );.#en
12200 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  dif..  disable_s
12210 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12220 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rs();.  pPager->
12230 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
12240 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12250 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
12260 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12270 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
12280 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
12290 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
122a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
122b0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
122c0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
122d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
122e0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
122f0 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
12300 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
12310 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12320 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12330 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
12340 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
12350 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12360 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
12370 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12380 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
12390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
123a0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
123b0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
123c0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
123d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
123e0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
123f0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
12400 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12410 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
12420 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
12430 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
12440 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
12450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
12460 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
12470 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12480 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
12490 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
124a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
124b0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
124c0 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
124d0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
124e0 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
124f0 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
12500 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
12510 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
12520 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
12530 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
12540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12550 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
12560 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
12570 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
12580 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12590 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
125a0 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
125b0 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
125c0 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
125d0 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
125e0 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
125f0 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
12600 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
12610 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
12620 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
12630 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12640 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
12650 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12660 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
12670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12680 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
12690 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
126a0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
126b0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
126c0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
126d0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
126e0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
126f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
12700 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
12710 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
12720 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12730 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
12740 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
12750 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
12760 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
12770 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
12780 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
12790 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
127a0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
127b0 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
127c0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
127d0 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
127e0 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
127f0 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
12800 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
12810 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
12820 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
12830 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
12840 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
12850 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
12860 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
12870 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
12880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
12890 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
128a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
128b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
128c0 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
128d0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
128e0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
128f0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
12900 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
12910 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12920 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
12930 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
12940 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
12950 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
12960 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
12970 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
12980 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12990 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
129a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
129b0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
129c0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
129d0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
129e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
129f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a00 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12a10 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12a20 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
12a30 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12a40 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
12a50 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
12a60 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
12a70 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
12a80 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
12a90 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
12aa0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
12ab0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
12ac0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
12ad0 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
12ae0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
12af0 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
12b00 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
12b10 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
12b20 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
12b30 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12b40 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
12b50 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
12b60 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
12b70 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
12b80 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
12b90 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
12ba0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
12bb0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
12bc0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
12bd0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
12be0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
12bf0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
12c00 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12c10 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
12c20 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
12c30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
12c40 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
12c50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12c60 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
12c70 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  g){.  page_ref(p
12c80 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12c90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12ca0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12cb0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
12cc0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
12cd0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
12ce0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12cf0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
12d00 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12d10 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12d20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
12d30 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
12d40 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
12d50 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12d70 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12d80 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12d90 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
12da0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12db0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
12dc0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
12dd0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
12de0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12df0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
12e00 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
12e10 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
12e20 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
12e30 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12e40 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12e50 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12e60 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12e70 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12e80 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12e90 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12ea0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12eb0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12ec0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
12ee0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12ef0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
12f00 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
12f10 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12f20 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
12f30 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12f40 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12f50 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12f60 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12f70 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12f80 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12f90 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12fa0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12fb0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12fc0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12fd0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
12fe0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12ff0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
13000 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
13010 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
13020 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
13030 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
13040 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
13050 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
13060 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
13070 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
13080 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
13090 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
130a0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
130b0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
130c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
130d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
130e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
130f0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
13100 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13110 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
13120 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
13130 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
13140 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
13150 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
13160 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
13170 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13180 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
13190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
131a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
131b0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
131c0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
131d0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
131e0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
131f0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
13200 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
13210 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
13220 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
13230 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
13240 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
13250 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
13260 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13270 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
13280 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
13290 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
132a0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
132b0 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
132c0 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
132d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
132e0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
132f0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
13300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13310 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13320 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
13330 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
13340 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13350 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
13360 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13370 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
13380 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13390 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
133a0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
133b0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
133c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
133d0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
133e0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
133f0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
13400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
13410 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
13420 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
13430 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
13440 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
13450 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
13460 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
13470 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
13480 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
13490 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
134a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
134b0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
134c0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
134d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
134e0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
134f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13500 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
13510 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
13520 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
13530 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13540 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13550 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13560 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
13570 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
13580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
135a0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
135b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
135d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
135e0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
135f0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
13600 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13610 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f  n rc;.        IO
13620 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
13630 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
13640 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
13650 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13660 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
13670 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
13680 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63  , 4)).        rc
13690 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
136a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
136b0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
136c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
136d0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
136e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
136f0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
13700 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13710 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
13720 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
13740 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
13750 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
13760 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
13770 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
13780 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22  CE(("JSYNC %d\n"
13790 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
137a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
137b0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
137c0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
137d0 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
137e0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
137f0 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
13800 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13810 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
13820 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13830 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
13840 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
13850 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
13860 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
13870 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13880 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13890 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
138a0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
138b0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
138c0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
138d0 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
138e0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
138f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13900 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
13910 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
13920 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
13930 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
13940 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
13950 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
13960 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
13970 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
13980 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
13990 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
139a0 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
139b0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
139c0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
139d0 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
139e0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
139f0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
13a00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13a10 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
13a20 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
13a30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
13a40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13a50 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
13a60 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
13a70 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13a80 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
13a90 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
13aa0 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
13ab0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
13ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
13ad0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
13ae0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
13af0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
13b00 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
13b10 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
13b20 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
13b30 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
13b40 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
13b50 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
13b60 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13b70 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
13b80 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
13b90 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
13ba0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
13bb0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13bc0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
13bd0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
13be0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
13bf0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
13c00 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13c10 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
13c20 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
13c30 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
13c50 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
13c60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
13c70 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
13c80 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
13c90 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
13ca0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
13cb0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
13cc0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
13cd0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
13ce0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
13cf0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
13d00 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
13d10 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
13d20 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13d30 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
13d40 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13d50 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
13d60 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
13d70 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
13d80 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
13d90 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
13da0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
13db0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
13dc0 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
13dd0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
13de0 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
13df0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13e00 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
13e10 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
13e20 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
13e30 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
13e40 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
13e50 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
13e60 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
13e70 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
13e80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
13e90 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
13ea0 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
13eb0 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
13ec0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
13ed0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
13ee0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
13ef0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
13f00 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
13f10 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
13f20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
13f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f40 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
13f50 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
13f60 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
13f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13f80 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
13f90 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
13fa0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
13fb0 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
13fc0 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
13fd0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
13fe0 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
13ff0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
14000 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
14010 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
14020 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
14030 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
14040 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
14050 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
14060 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
14070 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
14080 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
14090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
140a0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
140b0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
140c0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
140d0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
140e0 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
140f0 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
14100 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
14110 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
14120 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
14130 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
14140 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
14150 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
14160 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
14170 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
14180 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
14190 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
141a0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
141b0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
141c0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
141d0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
141e0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
141f0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
14200 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
14210 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
14220 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
14230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
14240 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
14250 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
14260 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
14270 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
14280 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
14290 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
142a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
142b0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
142c0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
142d0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
142e0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
142f0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
14300 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
14310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
14320 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
14330 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
14340 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
14350 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
14360 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
14370 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14380 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
14390 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
143a0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
143b0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
143c0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
143d0 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
143e0 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
143f0 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
14400 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
14410 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
14420 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
14430 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
14440 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
14450 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
14460 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
14470 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
14480 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
14490 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
144a0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
144b0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
144c0 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
144d0 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
144e0 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
144f0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
14500 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
14510 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
14520 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14530 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
14540 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
14550 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
14560 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
14570 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
14580 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
14590 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
145a0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
145b0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
145c0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
145d0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
145e0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
145f0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
14600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14610 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14620 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
14630 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
14640 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
14650 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
14660 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
14670 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14680 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
14690 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
146a0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
146b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
146c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
146d0 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
146e0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
146f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
14700 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
14710 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
14720 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
14730 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
14740 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
14750 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
14760 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
14770 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
14780 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
14790 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
147a0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
147b0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
147c0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
147d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
147e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
147f0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
14800 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63  bSize ){.      c
14810 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44  har *pData = COD
14820 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC2(pPager, PGHD
14830 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
14840 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
14850 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
14860 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70  ACE3("STORE %d p
14870 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
14880 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
14890 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
148a0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
148b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
148c0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a  , pList->pgno)).
148d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
148e0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
148f0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
14900 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14910 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28        TEST_INCR(
14920 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
14930 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
14940 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
14950 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
14960 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
14970 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14980 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14990 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
149a0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
149b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
149c0 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
149d0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
149e0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
149f0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
14a00 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
14a10 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
14a20 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
14a30 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
14a40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14a50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
14a60 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
14a70 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
14a80 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
14a90 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14aa0 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
14ab0 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
14ac0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
14ad0 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
14ae0 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
14af0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
14b00 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
14b10 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
14b20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14b30 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
14b40 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
14b50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
14b60 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
14b70 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
14b80 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
14b90 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
14ba0 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
14bb0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
14bc0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14bd0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
14be0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14bf0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
14c00 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
14c10 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
14c20 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
14c30 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
14c40 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
14c50 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
14c60 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
14c70 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
14c80 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
14c90 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
14ca0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
14cb0 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
14cc0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
14cd0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
14ce0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
14cf0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
14d00 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
14d10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
14d20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14d30 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
14d40 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14d50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14d60 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
14d70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14d80 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14d90 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
14da0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14dc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14dd0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
14de0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
14df0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
14e00 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
14e10 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
14e20 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
14e30 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
14e40 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
14e50 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
14e60 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
14e70 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
14e80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14e90 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
14ea0 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
14eb0 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14ec0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14ed0 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
14ee0 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
14ef0 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
14f00 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
14f10 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
14f20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
14f30 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
14f40 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
14f50 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
14f60 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
14f70 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
14f80 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
14f90 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
14fa0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
14fb0 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
14fc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
14fd0 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
14fe0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
14ff0 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
15000 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
15010 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
15020 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
15030 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
15040 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
15050 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
15060 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
15070 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
15080 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
15090 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
150a0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
150b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
150c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
150d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
150e0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
150f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
15100 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
15110 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
15120 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15130 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
15140 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
15150 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
15160 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
15170 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
15180 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
15190 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
151a0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
151b0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
151c0 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
151d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
151e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
151f0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
15200 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
15210 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
15220 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
15230 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
15240 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
15250 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
15260 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15270 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
15280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15290 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
152a0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
152b0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
152c0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
152d0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
152e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
152f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15300 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
15310 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  r->pFirst;.  }. 
15320 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
15330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15340 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
15350 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
15360 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
15370 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
15380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
15390 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
153a0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
153b0 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
153c0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
153d0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
153e0 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
153f0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
15400 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
15410 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
15420 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
15430 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
15440 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
15450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15460 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15470 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
15480 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
15490 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
154a0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
154b0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
154c0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
154d0 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
154e0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
154f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
15500 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
15510 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
15520 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
15530 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
15540 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
15550 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
15560 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
15570 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
15580 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
15590 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
155a0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
155b0 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
155c0 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
155d0 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
155e0 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
155f0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
15600 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
15610 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
15620 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
15630 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
15640 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
15650 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
15660 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
15670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
15680 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15690 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
156a0 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
156b0 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
156c0 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
156d0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
156e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
156f0 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
15700 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
15710 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
15720 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
15730 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
15740 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  if( pPg && pPg->
15750 70 67 6e 6f 21 3d 30 20 29 7b 0a 20 20 20 20 54  pgno!=0 ){.    T
15760 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
15770 3e 6e 4f 76 66 6c 29 3b 0a 20 20 7d 0a 0a 20 20  >nOvfl);.  }..  
15780 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
15790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
157a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
157b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
157c0 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
157d0 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
157e0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
157f0 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
15800 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
15810 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
15820 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
15830 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
15840 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
15850 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
15860 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
15870 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
15880 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15890 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
158a0 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
158b0 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
158c0 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
158d0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
158e0 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
158f0 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
15900 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
15910 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
15920 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15930 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
15940 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
15950 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
15960 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  eased..*/.#ifdef
15970 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15980 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15990 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
159a0 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
159b0 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
159c0 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
159d0 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
159e0 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
159f0 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a  ();.  Pager *p;.
15a00 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
15a10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
15a20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67   /* If the the g
15a30 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68  lobal mutex is h
15a40 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75  eld, this subrou
15a50 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20  tine becomes a. 
15a60 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62   ** o-op; zero b
15a70 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ytes of memory a
15a80 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  re freed.  This 
15a90 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  is because.  ** 
15aa0 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65  some of the code
15ab0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73   invoked by this
15ac0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
15ad0 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f  so.  ** try to o
15ae0 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  btain the mutex,
15af0 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
15b00 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  deadlock..  */. 
15b10 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e   if( sqlite3OsIn
15b20 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20  Mutex(0) ){.    
15b30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
15b40 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
15b50 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
15b60 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
15b70 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
15b80 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
15b90 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
15ba0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
15bb0 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
15bc0 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
15bd0 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
15be0 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
15bf0 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
15c00 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
15c10 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
15c20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
15c30 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
15c40 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
15c50 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
15c60 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
15c70 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
15c80 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
15c90 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
15ca0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
15cb0 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
15cc0 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
15cd0 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
15ce0 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
15cf0 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
15d00 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
15d10 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
15d20 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
15d30 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
15d40 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
15d50 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
15d60 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
15d70 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
15d80 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
15d90 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
15da0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
15db0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
15dc0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
15dd0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
15de0 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
15df0 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
15e00 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
15e10 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
15e20 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
15e30 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
15e40 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
15e50 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
15e60 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
15e70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
15e80 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
15e90 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
15ea0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
15eb0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
15ec0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
15ed0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
15ee0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
15ef0 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
15f00 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
15f10 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
15f20 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
15f30 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
15f40 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
15f50 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
15f60 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
15f70 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
15f80 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
15f90 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
15fa0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
15fb0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
15fc0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
15fd0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
15fe0 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
15ff0 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
16000 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
16010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16020 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
16030 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
16040 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
16050 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
16060 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
16070 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
16080 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
16090 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
160a0 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
160b0 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
160c0 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
160d0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tAll;.        }.
160e0 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65          nRelease
160f0 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63  d += sqliteAlloc
16100 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Size(pPg);.     
16110 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
16120 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
16130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16150 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
16160 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
16170 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
16180 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
16190 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
161a0 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
161b0 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
161c0 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
161d0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
161e0 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
161f0 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
16200 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
16210 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
16220 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
16230 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
16240 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
16250 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
16260 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
16270 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
16280 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
16290 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
162a0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
162b0 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
162c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
162d0 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d  ert( (rc&0xff)==
162e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20  SQLITE_IOERR || 
162f0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
16300 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
16310 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  t( p->state>=PAG
16320 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
16330 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
16340 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20  or(p, rc);.     
16350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16360 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64  return nReleased
16370 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
16380 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
16390 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f  RY_MANAGEMENT */
163a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
163b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
163c0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
163d0 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
163e0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
163f0 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
16400 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
16410 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
16420 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
16430 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
16440 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
16450 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
16460 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
16470 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
16480 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16490 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
164a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
164b0 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f   checks for a ho
164c0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  t-journal file. 
164d0 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
164e0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
164f0 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72  llback.** is per
16500 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65  formed immediate
16510 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
16520 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
16530 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
16540 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16550 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
16560 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
16570 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
16580 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
16590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
165a0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ager->nRef==0 );
165b0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
165c0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
165d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
165e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
165f0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
16600 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16610 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16620 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16630 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16640 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16670 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
16680 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
16690 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20   .      /* If a 
166a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
166b0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
166c0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
166d0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
166e0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
166f0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
16700 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
16710 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
16720 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
16730 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
16740 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
16750 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
16760 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16770 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16780 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
16790 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
167a0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
167b0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
167c0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
167d0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
167e0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
167f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
16800 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
16810 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
16820 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
16830 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
16840 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
16850 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
16860 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
16870 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  hat the.        
16880 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
16890 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
168a0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
168b0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
168c0 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  it .        ** b
168d0 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
168e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61  .        ** Beca
168f0 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
16900 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
16910 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
16920 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
16930 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
16940 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
16950 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
16960 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
16970 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  o.        ** obt
16980 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
16990 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
169a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
169b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
169c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
169d0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
169e0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
169f0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
16a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16a10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
16a20 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16a30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16a40 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
16a50 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
16a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
16a70 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
16a80 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
16a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
16aa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
16ab0 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
16ac0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
16ad0 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  SY if.        **
16ae0 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
16af0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
16b00 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
16b10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16b20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
16b30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
16b40 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
16b50 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
16b60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
16b70 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
16b80 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
16b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
16ba0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ds.        ** a 
16bb0 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
16bc0 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
16bd0 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
16be0 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20  or more.        
16bf0 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
16c00 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
16c10 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
16c20 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a  e..        **..*
16c30 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
16c40 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
16c50 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
16c60 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 09 2a  s because in ..*
16c70 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
16c80 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
16c90 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
16ca0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
16cb0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  d.        ** pos
16cc0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
16cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
16ce0 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
16cf0 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
16d00 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
16d10 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
16d20 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
16d30 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
16d40 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ires.        ** 
16d50 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
16d60 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
16d70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
16d80 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16d90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16da0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
16db0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
16dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
16dd0 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  t ro;.          
16de0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
16df0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
16e00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16e10 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
16e20 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
16e30 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
16e40 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20 20 20  d, &ro);.       
16e50 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20 20 20     if( ro ){.   
16e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16e70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
16e90 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
16ea0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
16eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16ee0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
16ef0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
16f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f10 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
16f20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16f30 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
16f40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16f50 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
16f60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
16f70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
16f80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
16f90 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
16fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
16fb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
16fc0 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a   0;. .        /*
16fd0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
16fe0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
16ff0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
17000 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
17010 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
17020 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
17030 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  d lock..        
17040 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
17050 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
17060 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
17070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17090 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
170a0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
170b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
170c0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
170d0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
170e0 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20  SHARED || .     
170f0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17100 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
17110 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
17120 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
17130 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
17140 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
17150 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
17160 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
17170 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
17180 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
17190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
171a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
171b0 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
171c0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
171d0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
171e0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a  evious.        *
171f0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
17200 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 49 66  transaction). If
17210 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17220 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
17230 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
17240 65 64 20 69 6e 20 50 61 67 65 72 2e 69 43 68 61  ed in Pager.iCha
17250 6e 67 65 43 6f 75 6e 74 20 6d 61 74 63 68 65 73  ngeCount matches
17260 20 74 68 61 74 20 66 6f 75 6e 64 20 6f 6e 20 70   that found on p
17270 61 67 65 20 31 20 6f 66 0a 20 20 20 20 20 20 20  age 1 of.       
17280 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
17290 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 64   file, then no d
172a0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
172b0 68 61 76 65 20 6f 63 63 75 72 65 64 20 73 69 6e  have occured sin
172c0 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ce.        ** th
172d0 65 20 63 61 63 68 65 20 77 61 73 20 6c 61 73 74  e cache was last
172e0 20 76 61 6c 69 64 20 61 6e 64 20 69 74 20 69 73   valid and it is
172f0 20 73 61 66 65 20 74 6f 20 72 65 74 61 69 6e 20   safe to retain 
17300 74 68 65 20 63 61 63 68 65 64 0a 20 20 20 20 20  the cached.     
17310 20 20 20 2a 2a 20 70 61 67 65 73 2e 20 4f 74 68     ** pages. Oth
17320 65 72 77 69 73 65 2c 20 69 66 20 50 61 67 65 72  erwise, if Pager
17330 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 64 6f  .iChangeCount do
17340 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
17350 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e  .        ** chan
17360 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 20 70 61  ge-counter on pa
17370 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
17380 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  , the current ca
17390 63 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  che contents.   
173a0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20       ** must be 
173b0 64 69 73 63 61 72 64 65 64 2e 0a 20 20 20 20 20  discarded..     
173c0 20 20 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 50     */..        P
173d0 67 48 64 72 20 2a 70 50 61 67 65 31 20 3d 20 70  gHdr *pPage1 = p
173e0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
173f0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
17400 69 66 28 20 70 50 61 67 65 31 20 29 7b 0a 20 20  if( pPage1 ){.  
17410 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61          unlinkPa
17420 67 65 28 70 50 61 67 65 31 29 3b 0a 0a 20 20 20  ge(pPage1);..   
17430 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
17440 75 72 65 20 74 68 65 20 66 6f 72 6d 65 72 20 70  ure the former p
17450 61 67 65 20 31 20 69 73 20 72 69 67 68 74 20 61  age 1 is right a
17460 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17470 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
17480 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
17490 74 72 69 67 67 65 72 73 20 61 20 73 70 65 63 69  triggers a speci
174a0 61 6c 20 63 61 73 65 20 69 6e 20 70 61 67 65 72  al case in pager
174b0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 29 0a 20  AllocatePage(). 
174c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72           ** to r
174d0 65 2d 75 73 65 20 74 68 69 73 20 70 61 67 65 20  e-use this page 
174e0 65 76 65 6e 20 69 66 20 74 68 65 20 74 6f 74 61  even if the tota
174f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
17500 73 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  s in.          *
17510 2a 20 74 68 65 20 63 61 63 68 65 20 69 73 20 6c  * the cache is l
17520 65 73 73 20 74 68 61 6e 20 50 61 67 65 72 2e 6d  ess than Pager.m
17530 78 50 61 67 65 2e 0a 20 20 20 20 20 20 20 20 20  xPage..         
17540 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
17550 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
17560 69 72 73 74 3d 3d 70 50 61 67 65 72 2d 3e 70 46  irst==pPager->pF
17570 69 72 73 74 53 79 6e 63 65 64 20 29 3b 0a 20 20  irstSynced );.  
17580 20 20 20 20 20 20 20 20 70 50 61 67 65 31 2d 3e          pPage1->
17590 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 61 67  pNextFree = pPag
175a0 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
175b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
175c0 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
175d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
175e0 70 46 69 72 73 74 2d 3e 70 50 72 65 76 46 72 65  pFirst->pPrevFre
175f0 65 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 20 20  e = pPage1;.    
17600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17610 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17620 20 21 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20   !pPager->pLast 
17630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
17640 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
17650 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 20  Page1;.         
17660 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
17670 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
17680 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 20 20  age1;.          
17690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
176a0 6e 63 65 64 20 3d 20 70 50 61 67 65 31 3b 0a 20  nced = pPage1;. 
176b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
176c0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
176d0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
176e0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  1) );.        rc
176f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
17700 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 31  cquire(pPager, 1
17710 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
17720 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 09 20 20 2f  QLITE_OK ){..  /
17740 2a 20 54 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * The change-cou
17750 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  nter is stored a
17760 74 20 6f 66 66 73 65 74 20 32 34 2e 20 53 65 65  t offset 24. See
17770 20 61 6c 73 6f 0a 20 20 20 20 20 20 20 20 20 20   also.          
17780 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
17790 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 2e 0a 20  angecounter().. 
177a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
177b0 20 20 20 20 20 20 75 33 32 20 69 43 68 61 6e 67        u32 iChang
177c0 65 43 6f 75 6e 74 20 3d 20 72 65 74 72 69 65 76  eCount = retriev
177d0 65 33 32 62 69 74 73 28 70 50 61 67 65 31 2c 20  e32bits(pPage1, 
177e0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  24);.          p
177f0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
17800 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17810 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
17820 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
17830 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
17840 20 20 20 20 20 20 20 20 69 66 28 20 69 43 68 61          if( iCha
17850 6e 67 65 43 6f 75 6e 74 21 3d 70 50 61 67 65 72  ngeCount!=pPager
17860 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 29  ->iChangeCount )
17870 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  {.            pa
17880 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
178a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
178b0 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20  >iChangeCount = 
178c0 69 43 68 61 6e 67 65 43 6f 75 6e 74 3b 0a 20 20  iChangeCount;.  
178d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
178e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
178f0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
17900 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
17910 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
17920 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
17930 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
17940 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
17950 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17960 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17970 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
17980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17990 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
179a0 72 20 72 65 63 79 63 6c 65 20 73 70 61 63 65 20  r recycle space 
179b0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
179c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
179d0 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
179e0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
179f0 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
17a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17a10 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
17a20 70 50 67 3b 0a 0a 20 20 69 66 28 20 21 28 70 50  pPg;..  if( !(pP
17a30 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17a40 65 64 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  ed && pPager->pF
17a50 69 72 73 74 53 79 6e 63 65 64 2d 3e 70 67 6e 6f  irstSynced->pgno
17a60 3d 3d 30 29 20 26 26 20 28 0a 20 20 20 20 20 20  ==0) && (.      
17a70 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
17a80 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
17a90 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
17aa0 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20  0 || MEMDB ||.  
17ab0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70 46 69      (pPager->pFi
17ac0 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
17ad0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
17ae0 63 29 0a 20 20 29 20 29 7b 0a 20 20 20 20 2f 2a  c).  ) ){.    /*
17af0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
17b00 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  ge */.    if( pP
17b10 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
17b20 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
17b30 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
17b40 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
17b50 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
17b60 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
17b70 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
17b80 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
17b90 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
17ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
17bb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17bc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
17bd0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
17be0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
17bf0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
17c00 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
17c10 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65  of(*pPg) + pPage
17c20 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  r->pageSize.    
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
17c50 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
17c60 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c80 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
17c90 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a  f(PgHistory) );.
17ca0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
17cb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
17cc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17cd0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
17ce0 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
17cf0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20      memset(pPg, 
17d00 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29  0, sizeof(*pPg))
17d10 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
17d20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
17d30 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
17d40 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
17d50 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
17d60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
17d70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
17d80 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
17d90 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
17da0 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  All;.    pPager-
17db0 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
17dc0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
17dd0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17de0 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ->nPage>pPager->
17df0 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20  nMaxPage ){.    
17e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17e10 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61  ->nMaxPage==(pPa
17e20 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b  ger->nPage-1) );
17e30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
17e40 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d  MaxPage++;.    }
17e50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17e60 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
17e70 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
17e80 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
17e90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
17ea0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
17eb0 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
17ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
17ee0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
17ef0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
17f00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17f10 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
17f20 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
17f30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
17f40 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
17f50 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
17f60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17f70 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
17f80 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
17f90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
17fa0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
17fb0 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
17fc0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
17fd0 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
17fe0 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
17ff0 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
18000 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
18010 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
18020 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
18030 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
18040 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
18050 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
18060 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
18070 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
18080 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
18090 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
180a0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
180b0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
180c0 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
180d0 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
180e0 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
180f0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
18100 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
18110 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
18120 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
18130 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
18140 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
18150 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
18160 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
18170 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
18180 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
18190 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
181a0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
181b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
181c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
181d0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
181e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
181f0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18200 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
18210 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
18220 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
18230 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
18240 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
18250 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
18260 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
18270 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
18280 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
18290 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
182a0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
182b0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
182c0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
182d0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
182e0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
182f0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
18300 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
18310 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
18320 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
18330 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
18340 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
18350 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
18360 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
18370 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
18380 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
18390 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
183a0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
183b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
183c0 63 6c 72 46 6c 61 67 20 69 73 20 66 61 6c 73 65  clrFlag is false
183d0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
183e0 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
183f0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
18400 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67 20 69  .** If clfFlag i
18410 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
18420 20 74 68 65 20 70 61 67 65 20 69 73 20 61 62 6f   the page is abo
18430 75 74 20 74 6f 20 62 65 20 65 72 61 73 65 64 20  ut to be erased 
18440 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74 65 6e  and.** rewritten
18450 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 62   without first b
18460 65 69 6e 67 20 72 65 61 64 20 73 6f 20 74 68 65  eing read so the
18470 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
18480 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 64  t doing.** the d
18490 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20  isk I/O..*/.int 
184a0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
184b0 69 72 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ire(Pager *pPage
184c0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 44 62  r, Pgno pgno, Db
184d0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 69  Page **ppPage, i
184e0 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20 20 50  nt clrFlag){.  P
184f0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
18500 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18510 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18520 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70  AGER_UNLOCK || p
18530 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
18540 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f   pgno==1 );..  /
18550 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
18560 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
18570 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
18580 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
18590 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
185a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
185b0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
185c0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
185d0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
185e0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
185f0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
18600 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18610 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18630 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
18640 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
18650 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
18660 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
18670 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
18680 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
18690 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
186a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
186b0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
186c0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
186d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
186e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
186f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
18700 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
18710 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
18720 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
18730 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
18740 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
18750 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
18760 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
18770 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
18780 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
18790 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
187a0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
187b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
187c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
187d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
187e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
187f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18800 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
18810 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
18820 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
18830 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
18840 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
18850 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
18860 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
18870 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
18880 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20  t nMax;.    int 
18890 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  h;.    TEST_INCR
188a0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
188b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
188c0 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
188d0 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
188e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18900 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
18910 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
18920 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18930 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
18940 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
18950 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
18960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
18970 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
18980 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
18990 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
189a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
189b0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
189c0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
189d0 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
189e0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
189f0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
18a00 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
18a10 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18a30 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
18a40 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
18a50 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
18a60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18a70 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
18a80 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
18a90 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
18aa0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
18ab0 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
18ac0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
18ad0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
18ae0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
18af0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
18b00 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
18b10 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
18b20 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
18b30 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  }.    makeClean(
18b40 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
18b50 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
18b60 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
18b70 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
18b80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18b90 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
18ba0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
18bb0 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
18bc0 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
18bd0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
18be0 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
18bf0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
18c00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
18c10 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
18c20 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
18c30 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
18c40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50  );.      rc = pP
18c50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
18c60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18c70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
18c80 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
18c90 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
18ca0 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
18cb0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
18cc0 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
18cd0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
18ce0 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
18cf0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
18d00 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
18d10 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63 6c   || MEMDB || (cl
18d20 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65 72  rFlag && !pPager
18d30 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
18d40 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ) ){.      memse
18d50 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
18d60 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
18d70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
18d90 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
18da0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18db0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
18dc0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
18dd0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
18de0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
18df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
18e10 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
18e20 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
18e30 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
18e60 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18e70 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
18e80 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
18e90 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
18ea0 6f 29 29 0a 20 20 20 20 20 20 50 41 47 45 52 54  o)).      PAGERT
18eb0 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
18ec0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
18ed0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18ee0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
18ef0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47  ODEC1(pPager, PG
18f00 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
18f10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
18f20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18f30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
18f40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18f50 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
18f60 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30     pPg->pgno = 0
18f70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18f80 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
18f90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18fa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   rc;.      }else
18fb0 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
18fc0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
18fd0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
18fe0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
18ff0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
19000 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
19010 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
19020 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
19030 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
19040 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
19050 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
19060 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
19070 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
19080 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
19090 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
190a0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
190b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
190c0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
190d0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
190e0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
190f0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
19100 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
19110 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
19120 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
19130 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
19140 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
19150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19160 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
19170 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
19180 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
19190 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
191a0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
191b0 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  );.    TEST_INCR
191c0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
191d0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
191e0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
191f0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
19200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19210 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
19220 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
19230 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
19240 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
19250 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
19260 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
19270 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
19280 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
19290 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
192a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
192b0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
192c0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
192d0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
192e0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
192f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
19300 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
19310 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
19320 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
19330 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
19340 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
19350 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19360 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
19370 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
19380 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
19390 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
193a0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
193b0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
193c0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
193d0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
193e0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
193f0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
19400 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
19410 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
19420 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
19430 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
19440 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
19450 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19460 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19470 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
19480 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
19490 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
194a0 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20  usiveMode );.   
194b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
194c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
194d0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
194e0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
194f0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
19500 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
19510 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
19520 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
19530 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
19540 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
19550 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
19560 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
19570 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
19580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
19590 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
195a0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
195b0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
195c0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
195d0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
195e0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
195f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
19600 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
19610 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
19620 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
19630 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
19640 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
19650 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
19660 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19670 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20  DbPage *pPg){.. 
19680 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19690 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
196a0 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
196b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
196c0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
196d0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
196e0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
196f0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
19700 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
19710 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
19720 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
19730 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
19740 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
19750 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
19760 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
19770 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
19780 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
19790 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
197a0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
197b0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
197c0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
197d0 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
197e0 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
197f0 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
19800 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
19810 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
19820 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
19830 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
19840 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
19850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19860 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
19870 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
19880 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
19890 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
198a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
198b0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
198c0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
198d0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
198e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
198f0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
19900 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
19910 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
19920 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19930 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
19940 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
19950 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
19960 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
19970 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
19980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19990 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
199a0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
199b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
199c0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
199d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
199e0 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
199f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
19a00 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
19a10 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
19a20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
19a30 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
19a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19a60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
19a70 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
19a80 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
19a90 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
19aa0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
19ab0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
19ac0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
19ad0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
19ae0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19af0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
19b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
19b10 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
19b20 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
19b30 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
19b40 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
19b50 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
19b60 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
19b70 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
19b80 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
19b90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
19ba0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
19bb0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
19bc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
19bd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
19be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
19c00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19c10 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19c20 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
19c30 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
19c40 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
19c50 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19c60 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
19c70 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
19c80 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
19c90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
19ca0 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
19cb0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
19cc0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
19cd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19ce0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19cf0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19d00 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
19d10 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
19d20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19d30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
19d70 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
19d80 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
19d90 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
19da0 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
19db0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
19dc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
19de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
19df0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19e00 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
19e10 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
19e20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c   }.    goto fail
19e30 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19e40 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  al;.  }.  sqlite
19e50 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
19e60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
19e70 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
19e80 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
19e90 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
19ea0 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
19eb0 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
19ec0 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
19ed0 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  y(pPager->jfd, p
19ee0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
19ef0 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  y);.  pPager->jo
19f00 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
19f10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19f20 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
19f30 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
19f40 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
19f50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
19f60 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
19f70 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
19f80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
19f90 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
19fa0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f  >errCode;.    go
19fb0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
19fc0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
19fd0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
19fe0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
19ff0 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
1a000 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1a010 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
1a020 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1a030 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
1a040 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a050 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
1a060 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
1a070 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1a080 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1a090 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1a0a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1a0b0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1a0c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1a0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a0e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a0f0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1a100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
1a110 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a120 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
1a130 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
1a140 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
1a150 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1a160 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1a170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1a180 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
1a190 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a1a0 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
1a1b0 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
1a1c0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1a1d0 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
1a1e0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1a1f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1a200 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  wo() is called..
1a210 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1a220 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69  agerRollback() i
1a230 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1a240 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
1a250 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
1a260 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1a270 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1a280 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
1a290 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
1a2a0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1a2b0 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
1a2c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1a2d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1a2e0 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
1a2f0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1a300 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
1a310 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
1a320 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
1a330 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
1a340 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
1a350 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1a360 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
1a370 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
1a380 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
1a390 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1a3a0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1a3b0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
1a3c0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1a3d0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1a3e0 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
1a3f0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
1a400 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a410 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
1a420 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1a430 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
1a440 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
1a450 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1a460 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
1a470 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1a480 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
1a490 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
1a4a0 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
1a4b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a4c0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
1a4d0 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
1a4e0 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
1a4f0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1a500 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
1a510 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1a520 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
1a530 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
1a540 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1a550 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
1a560 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
1a570 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
1a580 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1a590 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
1a5a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
1a5b0 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
1a5c0 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
1a5d0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
1a5e0 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
1a5f0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
1a600 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
1a610 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
1a620 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1a630 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70  rBegin(DbPage *p
1a640 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  Pg, int exFlag){
1a650 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1a660 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1a670 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a680 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1a690 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1a6a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a6b0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1a6c0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
1a6d0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1a6e0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
1a6f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a700 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1a710 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
1a720 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a730 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
1a740 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1a750 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a760 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1a770 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
1a780 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a790 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1a7a0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
1a7b0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
1a7c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a7d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a7e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
1a7f0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
1a800 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
1a810 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1a820 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1a830 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1a840 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
1a850 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1a860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1a880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a890 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1a8a0 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
1a8b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
1a8c0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
1a8d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1a8e0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
1a8f0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1a900 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
1a910 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1a920 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1a930 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1a940 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a950 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1a960 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a970 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
1a980 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
1a990 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1a9a0 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
1a9b0 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
1a9c0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c  ve-access mode l
1a9d0 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
1a9e0 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
1a9f0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
1aa00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
1aa10 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
1aa20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
1aa30 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
1aa40 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
1aa50 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
1aa60 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
1aa70 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20  n and truncated 
1aa80 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20  to 0 bytes..    
1aa90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1aaa0 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
1aab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1aac0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1aad0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1aae0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1aaf0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1ab00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1ab10 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1ab20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1ab30 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
1ab40 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
1ab50 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
1ab60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61    if( !pPager->a
1ab70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  InJournal ){.   
1ab80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1ab90 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1aba0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1abb0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1abc0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1abd0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1abe0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1abf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1ac00 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  rt( !pPager->jou
1ac10 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1ac20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1ac30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1ac40 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
1ac50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1ac60 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
1ac70 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
1ac80 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
1ac90 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
1aca0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1acb0 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
1acc0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1acd0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
1ace0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
1acf0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1ad00 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
1ad10 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
1ad20 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
1ad30 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
1ad40 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
1ad50 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
1ad60 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
1ad70 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
1ad80 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
1ad90 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
1ada0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1adb0 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
1adc0 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1add0 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
1ade0 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
1adf0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
1ae00 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
1ae10 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1ae20 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
1ae30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1ae40 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
1ae50 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1ae60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
1ae70 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1ae80 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70    pPg->pDirty->p
1ae90 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d  PrevDirty = pPg-
1aea0 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20  >pPrevDirty;.   
1aeb0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
1aec0 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20  pPrevDirty ){.  
1aed0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1aee0 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
1aef0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1af00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
1af10 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
1af20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1af30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
1af40 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
1af50 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
1af60 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
1af70 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1af80 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
1af90 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1afa0 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
1afb0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
1afc0 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
1afd0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
1afe0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
1aff0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1b000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b010 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
1b020 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
1b030 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
1b040 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
1b050 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b060 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
1b070 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
1b080 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
1b090 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
1b0a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1b0b0 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
1b0c0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1b0d0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
1b0e0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
1b0f0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
1b100 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
1b110 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
1b120 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
1b130 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1b140 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
1b150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b160 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
1b170 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
1b180 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
1b190 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
1b1a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1b1b0 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
1b1c0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
1b1d0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
1b1e0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
1b1f0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
1b200 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1b210 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
1b220 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
1b230 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
1b240 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
1b250 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
1b260 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
1b270 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1b280 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
1b290 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1b2a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1b2b0 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
1b2c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b2d0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1b2e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
1b2f0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
1b300 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1b310 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
1b320 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1b330 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1b340 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
1b350 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
1b360 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
1b370 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1b380 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1b390 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
1b3a0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1b3b0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1b3c0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1b3d0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1b3e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1b3f0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1b400 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1b410 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1b420 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
1b430 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
1b440 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1b450 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20  (pPg->inStmt || 
1b460 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1b470 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1b480 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b490 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1b4a0 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1b4b0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1b4c0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b4d0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1b4e0 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1b4f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1b500 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1b510 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1b520 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1b530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1b540 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1b550 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1b560 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1b570 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1b580 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1b590 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1b5a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1b5b0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1b5c0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1b5d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b5e0 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1b5f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b630 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b640 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1b650 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1b660 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b670 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1b680 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1b690 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b6a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1b6b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b6c0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1b6d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b6e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b6f0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1b700 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1b710 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1b720 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1b730 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1b740 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1b750 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1b760 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1b770 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1b780 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1b790 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1b7a0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1b7b0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1b7c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1b7d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1b7e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1b7f0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1b800 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1b810 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1b820 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1b830 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1b840 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1b850 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1b860 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1b870 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1b880 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1b890 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1b8a0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1b8b0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1b8c0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1b8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1b8e0 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1b8f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1b900 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1b910 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1b920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b930 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1b940 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1b950 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1b960 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1b970 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1b980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1b990 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1b9a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1b9b0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1b9c0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1b9d0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1b9e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1b9f0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1ba00 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1ba10 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1ba20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1ba30 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1ba40 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1ba50 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1ba60 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1ba70 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1ba80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1ba90 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1baa0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1bab0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1bac0 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1bad0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1bae0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1baf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1bb00 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1bb10 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1bb20 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1bb30 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1bb40 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1bb50 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1bb60 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1bb70 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1bb80 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1bb90 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1bba0 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1bbb0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1bbc0 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1bbd0 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1bbe0 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1bbf0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1bc00 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1bc10 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1bc20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bc30 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1bc40 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1bc50 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1bc60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bc70 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1bc80 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1bc90 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1bca0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1bcb0 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1bcc0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1bcd0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1bce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bcf0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1bd00 29 29 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  )).          pPa
1bd10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bd20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
1bd30 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1bd40 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1bd50 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1bd60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bd70 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1bd80 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1bd90 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
1bda0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1bdb0 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1bdc0 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  ..  /* An error 
1bdd0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
1bde0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
1bdf0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
1be00 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1be10 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
1be20 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
1be30 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
1be40 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1be50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1be60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1be70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1be80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1be90 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1bea0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1beb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bec0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1bed0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
1bee0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bef0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1bf00 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1bf10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
1bf20 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1bf30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1bf40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1bf50 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1bf60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1bf70 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1bf80 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1bf90 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1bfa0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f             page_
1bfb0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1bfc0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
1bfd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1bfe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bff0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c000 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
1c010 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
1c020 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1c030 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c040 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
1c050 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
1c060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c070 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c080 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1c090 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
1c0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c0b0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
1c0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c0d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1c0e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c0f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1c100 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
1c110 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
1c120 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1c130 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
1c140 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
1c150 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
1c160 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1c170 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
1c180 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
1c190 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
1c1a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1c1b0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
1c1c0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
1c1d0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
1c1e0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
1c1f0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
1c200 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
1c210 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
1c220 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1c230 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
1c240 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
1c250 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1c260 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1c270 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c280 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1c290 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1c2a0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1c2b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1c2c0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1c2d0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c2e0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c2f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c300 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1c310 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
1c320 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
1c330 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
1c340 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1c350 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1c360 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1c370 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1c380 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1c390 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
1c3a0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1c3b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c3c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c3d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1c3e0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1c3f0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c400 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c410 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c430 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1c440 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1c450 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1c460 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75  7)-4;.        pu
1c470 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
1c480 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c4a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c4b0 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  stfd, pData2, pP
1c4c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
1c4d0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1c4e0 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1c4f0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1c500 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c510 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1c520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1c530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c550 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c560 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
1c570 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
1c580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c590 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1c5a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1c5b0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1c5c0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1c5d0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d  pgno&7);.      }
1c5e0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1c5f0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1c600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c610 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1c620 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1c630 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1c640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c650 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1c660 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1c670 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1c680 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1c690 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1c6a0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1c6b0 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1c6c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1c6d0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1c6e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1c6f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c700 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1c710 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c720 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c730 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1c740 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1c750 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1c760 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1c770 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1c780 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1c790 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1c7a0 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1c7b0 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1c7c0 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1c7d0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1c7e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1c7f0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1c800 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1c810 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1c820 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1c830 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1c840 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1c850 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1c860 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1c870 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1c880 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1c890 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1c8a0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1c8b0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1c8c0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1c8d0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1c8e0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1c8f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c900 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1c910 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1c920 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1c930 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1c940 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1c950 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1c960 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1c970 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1c980 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1c990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c9a0 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1c9b0 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1c9c0 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1c9d0 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1c9e0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1c9f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1ca00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1ca10 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca30 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1ca40 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1ca50 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1ca60 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ca80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ca90 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1caa0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1cab0 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1cac0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1cad0 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1cae0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1caf0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1cb00 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1cb10 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1cb20 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1cb30 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1cb40 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1cb50 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1cb60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cb70 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1cb80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1cb90 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1cba0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1cbb0 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1cbc0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1cbd0 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1cbe0 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1cbf0 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1cc00 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1cc10 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1cc20 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1cc30 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1cc40 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1cc50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1cc60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1cc70 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1cc80 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1cc90 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1cca0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1ccb0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ccc0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1ccd0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1cce0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1ccf0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1cd00 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1cd10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1cd20 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1cd30 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1cd40 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1cd50 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1cd60 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1cd70 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1cd80 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1cd90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1cda0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1cdb0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1cdc0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1cdd0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1cde0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1cdf0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1ce00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ce10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1ce20 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1ce30 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1ce40 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1ce50 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1ce60 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1ce70 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ce80 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1ce90 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1cea0 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1ceb0 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1cec0 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1ced0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1cee0 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1cef0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1cf00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cf10 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1cf20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1cf30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1cf40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cf50 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1cf60 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1cf80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1cf90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1cfa0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1cfb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cfc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cfd0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1cfe0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1cff0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1d000 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1d010 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1d020 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1d040 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1d050 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1d060 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1d070 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1d080 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d090 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1d0a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1d0b0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1d0c0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1d0d0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1d0e0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1d0f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1d100 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1d110 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1d120 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1d130 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1d140 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1d150 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1d160 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1d170 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1d180 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1d190 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d1a0 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1d1b0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1d1c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1d1d0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1d1e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1d1f0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1d200 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d210 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1d220 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1d230 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1d240 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d270 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1d280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1d2a0 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1d2b0 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1d2c0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1d2d0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1d2e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d2f0 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1d300 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1d310 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1d320 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1d330 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1d340 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1d350 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1d360 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1d370 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
1d380 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
1d390 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1d3a0 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1d3b0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1d3c0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1d3d0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1d3e0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1d3f0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1d400 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1d410 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1d420 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1d430 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1d440 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1d450 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1d460 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1d470 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1d480 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1d490 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1d4a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1d4b0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1d4c0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1d4d0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1d4e0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1d4f0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1d500 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1d510 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1d520 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1d530 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1d540 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1d550 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d560 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1d570 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1d580 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1d590 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1d5a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1d5b0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d5c0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1d5d0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1d5e0 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1d5f0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d600 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1d610 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1d620 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1d630 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1d640 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d650 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1d660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1d670 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1d680 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1d690 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1d6a0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1d6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1d6c0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1d6d0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1d6e0 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1d6f0 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1d700 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1d710 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d720 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1d730 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1d740 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1d750 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1d760 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1d770 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1d780 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1d790 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1d7a0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1d7b0 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1d7c0 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1d7d0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1d7e0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d7f0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
1d800 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1d810 74 57 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  tWrite(Pager *pP
1d820 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1d830 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1d840 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
1d850 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
1d860 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1d870 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
1d880 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20  sert( pPg!=0 ); 
1d890 20 2f 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c   /* We never cal
1d8a0 6c 20 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e  l _dont_write un
1d8b0 6c 65 73 73 20 74 68 65 20 70 61 67 65 20 69 73  less the page is
1d8c0 20 69 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67   in mem */.  pPg
1d8d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1d8e0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1d8f0 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1d900 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1d910 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d920 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1d930 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1d940 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d950 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1d960 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1d970 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1d980 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1d990 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1d9a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1d9b0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1d9c0 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1d9d0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1d9e0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1d9f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1da00 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1da10 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1da20 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1da30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1da40 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1da50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1da60 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1da70 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1da80 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1da90 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1daa0 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1dab0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1dac0 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1dad0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1dae0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1daf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1db00 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1db10 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1db20 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1db30 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1db40 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1db50 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1db60 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1db70 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1db80 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1db90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1dba0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1dbb0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1dbc0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1dbd0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1dbe0 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1dbf0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1dc00 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
1dc10 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
1dc20 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1dc30 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
1dc40 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1dc50 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1dc60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1dc70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  }.}../*.** A cal
1dc80 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1dc90 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1dca0 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
1dcb0 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
1dcc0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1dcd0 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
1dce0 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
1dcf0 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
1dd00 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
1dd10 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
1dd20 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
1dd30 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1dd40 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
1dd50 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76  ck journal..*/.v
1dd60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1dd70 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1dd80 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1dd90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1dda0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1ddb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ddc0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1ddd0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1dde0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1ddf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1de00 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1de10 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1de20 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1de30 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1de40 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1de50 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1de60 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1de70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1de80 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1de90 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1dea0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1deb0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1dec0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1ded0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1dee0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1def0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1df00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1df10 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1df20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1df30 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1df40 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1df50 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1df60 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1df70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
1df80 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
1df90 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1dfa0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1dfb0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1dfc0 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
1dfd0 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
1dfe0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1dff0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
1e000 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e010 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1e020 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1e030 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1e040 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1e050 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1e060 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1e070 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1e080 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1e090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e0a0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1e0b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1e0c0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1e0d0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1e0e0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1e0f0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1e100 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1e110 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e120 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1e130 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1e140 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1e150 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1e160 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1e170 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1e180 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e190 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1e1a0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1e1b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1e1c0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1e1d0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1e1e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1e1f0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1e200 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1e210 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e220 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1e230 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1e240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e250 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1e260 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1e270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e280 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1e290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e2a0 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1e2b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e2c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1e2d0 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  n rc;.  .    /* 
1e2e0 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1e2f0 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1e300 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1e310 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1e320 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1e330 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  , 24);.  .    /*
1e340 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1e350 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1e360 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1e370 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1e380 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e390 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1e3a0 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1e3b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1e3c0 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1e3d0 75 6e 74 65 72 29 3b 0a 20 20 20 20 70 50 61 67  unter);.    pPag
1e3e0 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74  er->iChangeCount
1e3f0 20 3d 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65   = change_counte
1e400 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  r;.  .    /* Rel
1e410 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
1e420 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
1e430 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e440 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
1e450 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e460 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
1e470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e480 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1e490 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1e4a0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1e4b0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1e4c0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1e4d0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1e4e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1e4f0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1e500 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e510 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1e520 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1e530 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1e540 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1e550 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1e560 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1e570 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1e580 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1e590 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e5a0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1e5b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1e5c0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1e5d0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1e5e0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1e5f0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1e600 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1e610 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1e620 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1e630 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1e640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1e650 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1e660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1e670 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1e680 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1e690 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1e6a0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1e6b0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1e6c0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1e6d0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1e6e0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1e6f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1e700 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
1e710 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1e720 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1e730 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1e740 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1e750 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1e760 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1e770 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1e780 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e790 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1e7a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e7b0 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20  tPhaseOne(Pager 
1e7c0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
1e7d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
1e7e0 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
1e7f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e800 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  ;..  PAGERTRACE4
1e810 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1e820 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1e830 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1e840 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1e850 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1e860 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1e870 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1e880 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1e890 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1e8a0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1e8b0 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1e8c0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1e8d0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1e8e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1e8f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1e900 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1e910 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1e920 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1e930 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1e940 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
1e950 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1e960 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
1e970 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
1e980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1e990 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
1e9a0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1e9b0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
1e9c0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
1e9d0 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
1e9e0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
1e9f0 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
1ea00 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
1ea10 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
1ea20 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
1ea30 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
1ea40 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1ea50 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
1ea60 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
1ea70 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
1ea80 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
1ea90 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
1eaa0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
1eab0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1eac0 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
1ead0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1eae0 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
1eaf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
1eb00 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1eb10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1eb20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eb30 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1eb40 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1eb50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1eb60 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
1eb70 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
1eb80 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1eb90 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1eba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1ebb0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1ebc0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
1ebd0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1ebe0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1ebf0 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1ec00 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1ec10 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1ec20 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1ec30 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
1ec40 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1ec50 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1ec60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1ec70 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1ec80 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1ec90 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1eca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1ecb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ecc0 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1ecd0 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
1ece0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1ecf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ed00 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
1ed10 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
1ed20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ed30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1ed40 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1ed50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ed60 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1ed70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1ed80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1ed90 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1eda0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1edb0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1edc0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1edd0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1ede0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1edf0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1ee00 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1ee10 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1ee20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ee30 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1ee40 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1ee50 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1ee60 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1ee70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1ee80 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1ee90 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1eea0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1eeb0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
1eec0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1eed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1eee0 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
1eef0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
1ef00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ef10 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1ef20 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
1ef30 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
1ef40 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1ef50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ef60 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
1ef70 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1ef80 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1ef90 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1efa0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1efb0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1efc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1efd0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1efe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1eff0 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rty = 0;..    /*
1f000 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1f010 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1f020 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1f030 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1f040 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1f050 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1f060 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
1f070 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
1f080 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
1f090 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1f0a0 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1f0b0 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
1f0c0 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
1f0d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f0e0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
1f0f0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1f100 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
1f110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1f120 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1f130 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1f140 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1f150 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1f160 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1f170 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1f180 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1f190 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1f1a0 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1f1b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1f1c0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1f1d0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1f1e0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1f1f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1f200 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f210 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
1f220 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f230 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
1f240 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
1f250 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1f260 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1f270 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1f280 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f290 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1f2a0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1f2b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1f2c0 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
1f2d0 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1f2e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f2f0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1f300 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1f310 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1f320 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1f330 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1f340 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1f350 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1f360 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1f370 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1f380 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1f390 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1f3a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1f3b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1f3c0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1f3d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1f3e0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1f3f0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1f400 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1f410 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
1f420 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1f430 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
1f440 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1f450 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1f460 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1f470 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1f480 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1f490 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1f4a0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1f4b0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1f4c0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1f4d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1f4e0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1f4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1f500 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1f510 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1f520 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1f530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1f540 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1f550 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1f560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1f570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f580 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
1f590 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f5a0 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  he );.  assert( 
1f5b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1f5c0 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21  AGER_SYNCED || !
1f5d0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f5e0 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  he );.  rc = pag
1f5f0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1f600 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  on(pPager);.  re
1f610 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1f620 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1f630 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1f640 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
1f650 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
1f660 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1f670 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
1f680 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
1f690 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
1f6a0 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
1f6b0 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
1f6c0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1f6d0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1f6e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1f6f0 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
1f700 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
1f710 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
1f720 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
1f730 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
1f740 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
1f750 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
1f760 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
1f770 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
1f780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
1f790 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
1f7a0 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
1f7b0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
1f7c0 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
1f7d0 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
1f7e0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
1f7f0 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
1f800 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
1f810 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
1f820 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1f830 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1f840 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
1f850 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1f860 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f870 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
1f880 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
1f890 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1f8a0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
1f8b0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1f8c0 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
1f8d0 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
1f8e0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1f8f0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1f900 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f910 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
1f920 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
1f930 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
1f940 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
1f950 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
1f960 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1f970 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
1f980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f990 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
1f9a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1f9b0 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
1f9c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
1f9d0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
1f9e0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
1f9f0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1fa00 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1fa10 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
1fa20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
1fa30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
1fa40 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
1fa50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fa60 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1fa70 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
1fa80 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
1fa90 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1faa0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1fab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fac0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
1fad0 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
1fae0 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
1faf0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1fb00 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
1fb10 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
1fb20 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
1fb30 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1fb40 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
1fb50 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53   0;.      p->inS
1fb60 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1fb70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d  ->pPrevStmt = p-
1fb80 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1fb90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1fba0 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
1fbb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
1fbc0 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67  Reiniter(p, pPag
1fbd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fbe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fbf0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1fc00 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1fc10 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1fc20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1fc30 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1fc40 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
1fc50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
1fc60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1fc70 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
1fc80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1fc90 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1fca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fcb0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
1fcc0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1fcd0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
1fce0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1fcf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1fd00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1fd10 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
1fd20 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
1fd30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1fd40 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1fd50 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1fd60 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1fd70 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1fd80 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
1fd90 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
1fda0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
1fdb0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1fdc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1fdd0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1fde0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
1fdf0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
1fe00 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
1fe10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1fe20 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1fe30 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
1fe40 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1fe50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1fe60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fe70 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1fe80 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1fe90 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1fea0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
1feb0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
1fec0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
1fed0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1fee0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
1fef0 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
1ff00 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
1ff10 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
1ff20 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
1ff30 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
1ff40 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
1ff50 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
1ff60 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
1ff70 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  */.  return page
1ff80 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1ff90 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc);.}../*.** Re
1ffa0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1ffb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ffc0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
1ffd0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
1ffe0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
1fff0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
20000 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
20010 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20020 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
20030 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20040 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
20050 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
20060 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
20070 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20080 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
20090 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
200a0 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
200b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
200c0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b  rn pPager->nRef;
200d0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
200e0 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
200f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20100 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
20110 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
20120 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
20130 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
20140 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
20150 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
20160 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
20170 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
20180 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
20190 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
201a0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
201b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
201c0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
201d0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
201e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
201f0 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
20200 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
20210 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
20220 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
20230 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20  ->nOvfl;.  a[9] 
20240 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
20250 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
20260 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
20270 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
20280 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
20290 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
202a0 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
202b0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
202c0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
202d0 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
202e0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
202f0 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
20300 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
20310 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
20320 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
20330 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
20340 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
20350 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
20360 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
20370 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
20380 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
20390 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
203a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
203b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
203c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
203d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
203e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
203f0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
20400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
20410 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
20420 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
20430 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
20440 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20450 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
20460 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20470 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
20480 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
20490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
204a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
204b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
204c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
204d0 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
204e0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
204f0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
20500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20520 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
20530 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
20540 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
20550 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
20560 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
20570 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
20580 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
20590 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
205a0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
205b0 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
205c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
205d0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
205e0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
205f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
20600 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
20610 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
20620 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
20630 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
20640 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20650 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
20660 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20670 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
20680 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
20690 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
206a0 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
206b0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
206c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
206d0 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
206e0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
206f0 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
20700 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
20710 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
20720 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
20730 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20740 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72  Opentemp(&pPager
20750 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
20760 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
20770 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
20780 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
20790 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
207a0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
207b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
207c0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
207d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
207e0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
207f0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
20800 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
20810 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
20820 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
20830 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
20840 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
20850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20860 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
20870 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
20880 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
20890 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
208a0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
208b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
208c0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
208d0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
208e0 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
208f0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
20900 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20910 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
20920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
20930 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
20940 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
20950 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
20960 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
20970 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
20980 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
20990 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
209a0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
209b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
209c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
209d0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
209e0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
209f0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
20a00 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
20a10 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
20a20 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
20a30 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
20a40 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
20a50 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
20a60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
20a70 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
20a80 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
20a90 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
20aa0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
20ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
20ac0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
20ad0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
20ae0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
20af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
20b00 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
20b10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
20b20 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
20b30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
20b40 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
20b50 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
20b60 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
20b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20b80 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
20b90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
20ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
20bb0 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
20bc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20bd0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
20be0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20bf0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
20c00 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
20c10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20c20 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
20c30 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
20c40 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
20c50 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
20c60 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
20c70 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
20c80 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
20c90 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
20ca0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
20cb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
20cc0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
20cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
20ce0 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
20cf0 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
20d00 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
20d10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
20d20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
20d30 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
20d40 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
20d50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20d60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20d70 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20d80 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
20d90 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
20da0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
20db0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
20dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
20dd0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
20de0 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
20df0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20e00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
20e10 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
20e20 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
20e30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20e40 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
20e50 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
20e60 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
20e70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20e80 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
20e90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20ea0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
20eb0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
20ec0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
20ed0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20ee0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
20ef0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
20f00 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
20f10 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
20f20 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
20f30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
20f40 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
20f50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20f60 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20f70 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
20f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20f90 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
20fa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20fb0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
20fc0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
20fd0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
20fe0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
20ff0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
21000 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
21010 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
21020 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
21030 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
21040 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
21050 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
21060 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
21070 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
21080 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
21090 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
210a0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
210b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
210c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
210d0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
210e0 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
210f0 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
21100 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
21110 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
21120 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
21130 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
21140 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
21150 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
21160 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
21170 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
21180 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
21190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
211a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
211b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
211c0 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
211d0 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74  y pData to locat
211e0 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
211f0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  file. .**.** The
21200 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
21210 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
21220 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e  current page pgn
21230 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61  o. If current pa
21240 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f  ge.** pgno is no
21250 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
21260 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
21270 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69  l, it is not wri
21280 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a  tten there by.**
21290 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
212a0 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69  . The same appli
212b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
212c0 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f  Data refers to o
212d0 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  n entry to.** th
212e0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
212f0 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
21300 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64  the page refered
21310 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d   to by pData rem
21320 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
21330 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
21340 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
21350 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20  with page pData 
21360 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
21370 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
21380 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
21390 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
213a0 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
213b0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
213c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
213d0 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
213e0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
213f0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
21400 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
21410 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
21420 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
21430 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21440 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
21450 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
21460 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
21470 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
21480 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
21490 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
214a0 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
214b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
214c0 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69  is active)..*/.i
214d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
214e0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
214f0 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
21500 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
21510 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
21520 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
21530 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
21540 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
21550 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
21560 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
21570 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
21580 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
21590 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
215a0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
215b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
215c0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
215d0 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
215e0 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
215f0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
21600 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
21610 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
21620 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
21630 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
21640 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
21650 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  Pg->inJournal );
21660 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
21670 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
21680 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21690 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
216a0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
216b0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
216c0 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
216d0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
216e0 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
216f0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
21700 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
21710 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
21720 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
21730 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
21740 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
21750 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
21760 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
21770 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
21780 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
21790 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
217a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
217b0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
217c0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
217d0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c  re..  */.  pPgOl
217e0 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
217f0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
21800 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
21810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
21820 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
21830 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
21840 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
21850 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  d);.    makeClea
21860 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69  n(pPgOld);.    i
21870 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53  f( pPgOld->needS
21880 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
21890 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a  ert( pPgOld->inJ
218a0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
218b0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
218c0 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   1;.      pPg->n
218d0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
218e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
218f0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
21900 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
21910 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
21920 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
21930 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
21940 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
21950 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
21960 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
21970 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
21980 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
21990 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
219a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
219b0 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
219c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
219d0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
219e0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
219f0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
21a00 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
21a10 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
21a20 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
21a30 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
21a40 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
21a50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
21a60 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
21a70 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
21a80 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21a90 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
21aa0 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
21ab0 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
21ac0 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
21ad0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
21ae0 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
21af0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
21b00 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
21b10 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
21b20 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
21b30 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
21b40 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
21b50 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
21b60 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
21b70 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
21b80 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
21b90 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
21ba0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
21bb0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
21bc0 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
21bd0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
21be0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
21bf0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
21c00 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
21c10 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
21c20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
21c30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
21c40 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
21c50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
21c60 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
21c70 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
21c80 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
21c90 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
21ca0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
21cb0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
21cc0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
21cd0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
21ce0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
21cf0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
21d00 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
21d10 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
21d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21d30 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
21d40 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
21d50 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
21d60 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
21d70 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
21d80 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
21d90 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
21da0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
21db0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
21dc0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
21dd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
21de0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
21df0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
21e00 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
21e10 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
21e20 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
21e30 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
21e40 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
21e50 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
21e60 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
21e70 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
21e80 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
21e90 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
21ea0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
21eb0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
21ec0 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
21ed0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
21ee0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
21ef0 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
21f00 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
21f10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21f20 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
21f30 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
21f40 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
21f50 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
21f60 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
21f70 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
21f80 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
21f90 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
21fa0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
21fb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
21fc0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
21fd0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
21fe0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
21ff0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
22000 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
22010 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
22020 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
22030 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
22040 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
22050 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
22060 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
22070 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
22080 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
22090 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
220a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
220b0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
220c0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
220d0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
220e0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
220f0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
22100 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
22110 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
22120 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
22130 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
22140 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22150 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
22160 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
22170 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
22180 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
22190 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
221a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
221b0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
221c0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
221d0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
221e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
221f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
22200 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
22210 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
22220 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
22230 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
22240 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22250 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22260 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
22270 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
22280 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
22290 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
222a0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
222b0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
222c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
222d0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
222e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
222f0 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
22300 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
22310 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
22320 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
22330 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
22340 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
22350 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
22360 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
22370 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
22380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22390 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
223a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
223b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
223c0 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
223d0 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
223e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
223f0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
22400 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
22410 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
22420 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
22430 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
22440 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
22450 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
22460 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
22470 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
22480 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
22490 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
224a0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
224b0 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
224c0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
224d0 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
224e0 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
224f0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
22500 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
22510 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
22520 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
22530 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
22540 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22550 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.