/ Hex Artifact Content
Login

Artifact 680bf115aa1678a011ce046f2a1ef4cad45576cb:


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 32 38  : pager.c,v 1.28
0350: 36 20 32 30 30 37 2f 30 33 2f 30 36 20 31 33 3a  6 2007/03/06 13:
0360: 34 36 3a 30 30 20 64 61 6e 69 65 6c 6b 31 39 37  46:00 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 54 52 41 43 45 31 28 58 29 20 20 20 20  ne TRACE1(X)    
0470: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0480: 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65  rintf(X).#define
0490: 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20   TRACE2(X,Y)    
04a0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04b0: 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  ntf(X,Y).#define
04c0: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20   TRACE3(X,Y,Z)  
04d0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04e0: 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69  ntf(X,Y,Z).#defi
04f0: 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  ne TRACE4(X,Y,Z,
0500: 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  W) sqlite3DebugP
0510: 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23  rintf(X,Y,Z,W).#
0520: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
0530: 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33  Y,Z,W,V) sqlite3
0540: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
0550: 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65  Z,W,V).#else.#de
0560: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23  fine TRACE1(X).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Y).#define TRACE
0590: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05a0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
05b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35 28  .#define TRACE5(
05c0: 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69  X,Y,Z,W,V).#endi
05d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
05e0: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
05f0: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
0600: 6e 20 74 68 65 20 54 52 41 43 45 58 28 29 20 6d  n the TRACEX() m
0610: 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74  acros above.** t
0620: 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65  o print out file
0630: 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a  -descriptors. .*
0640: 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74  *.** PAGERID() t
0650: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
0660: 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74  o a Pager struct
0670: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
0680: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0690: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
06a0: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
06b0: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
06c0: 20 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65   takes an OsFile
06d0: 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74  .** struct as it
06e0: 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  's argument..*/.
06f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0700: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0710: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0720: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0730: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0740: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0750: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0760: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0770: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0780: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
0790: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07a0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07b0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07c0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
07f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0800: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0840: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0850: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0860: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0870: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0880: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
0890: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08a0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08b0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08d0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08e0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
08f0: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0910: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0920: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0930: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0960: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0970: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0980: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
0990: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09b0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09e0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
09f0: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a00: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a20: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a30: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a40: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a60: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a70: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a80: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0a90: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ac0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ad0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b00: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b10: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b20: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b30: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b40: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b70: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b80: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bb0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bc0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0bd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0be0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0bf0: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c00: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c10: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c20: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c30: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c40: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c70: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c80: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0c90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cb0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cc0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0cd0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d00: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d10: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74  o is to remove t
0d20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
0d40: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65  nal file and the
0d50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
0d60: 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  l be.**         
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0d80: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0d90: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0da0: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0db0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0dc0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0dd0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
0de0: 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74  occurs, the stat
0df0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0e00: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
0e10: 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65  * After all page
0e20: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65  s have been rele
0e30: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
0e40: 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a  e_page_unref(),.
0e50: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61  ** the state tra
0e60: 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f  nsitions back to
0e70: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0e80: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  The first time.*
0e90: 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61  * that sqlite3pa
0ea0: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
0eb0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0ec0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0ed0: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0ee0: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0ef0: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0f00: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0f10: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0f20: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0f30: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0f40: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0f50: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0f60: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0f70: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0f80: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0f90: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0fa0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0fb0: 53 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e  SIVE occurs when
0fc0: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
0fd0: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
0fe0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ff0: 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20  file.  After an 
1000: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
1010: 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71  lback().** or sq
1020: 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69  lite_pager_commi
1030: 74 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67  t(), the state g
1040: 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  oes back to PAGE
1050: 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65  R_SHARED..*/.#de
1060: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1070: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1080: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
1090: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
10a0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
10b0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
10c0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
10d0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
10e0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
10f0: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1100: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1110: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1120: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1130: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1140: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1150: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1160: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1170: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1180: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
1190: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
11a0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
11b0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
11c0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
11d0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
11e0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
11f0: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1200: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1220: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1230: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1240: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1250: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1260: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1270: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1280: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
1290: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
12a0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
12b0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
12c0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
12d0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
12e0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
12f0: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1300: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1310: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1320: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1330: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1340: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1350: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1360: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1370: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1380: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
1390: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
13a0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
13b0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
13c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
13d0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
13e0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
13f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1400: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1410: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1420: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1430: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1440: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1450: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1460: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1470: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1480: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1490: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
14a0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
14b0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
14c0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
14d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
14e0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
14f0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1500: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1510: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1520: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1540: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1550: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1560: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1570: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1580: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
1590: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
15a0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
15b0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
15c0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
15d0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
15e0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
15f0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e  pager_write() on
1600: 20 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f   a page prior to
1610: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d   making.** any m
1620: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
1630: 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20  that page.  The 
1640: 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74  first time sqlit
1650: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a  e3pager_write().
1660: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ** is called, th
1670: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
1680: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69  contents are wri
1690: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f  tten into the ro
16a0: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
16b0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f  l and PgHdr.inJo
16c0: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
16d0: 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74  needSync are set
16e0: 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a  .  Later, once.*
16f0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  * the journal pa
1700: 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f  ge has made it o
1710: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
1720: 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64  face, PgHdr.need
1730: 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72  Sync.** is clear
1740: 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65  ed.  The modifie
1750: 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  d page cannot be
1760: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
1770: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1780: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1790: 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e   until the journ
17a0: 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65  al pages has bee
17b0: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
17c0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64   and the.** PgHd
17d0: 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62  r.needSync has b
17e0: 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  een cleared..**.
17f0: 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72  ** The PgHdr.dir
1800: 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ty flag is set w
1810: 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  hen sqlite3pager
1820: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
1830: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
1840: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
1850: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1860: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
1870: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
1880: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1890: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
18a0: 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72  ruct PgHdr PgHdr
18b0: 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  ;.struct PgHdr {
18c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
18f0: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
1900: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
1910: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1930: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1940: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1950: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1960: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
1970: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
1980: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
1990: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
19a0: 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c  gHdr *pNextFree,
19b0: 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a   *pPrevFree;  /*
19c0: 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67   Freelist of pag
19d0: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  xtAll;          
1a00: 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f       /* A list o
1a10: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
1a20: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
1a30: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
1a40: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
1a50: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1a60: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
1a70: 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  8 inJournal;    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65   TRUE if has bee
1aa0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  n written to jou
1ab0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
1ac0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1ae0: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
1af0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
1b00: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
1b30: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
1b40: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
1b50: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
1b80: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
1b90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1ba0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
1bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bc0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
1bd0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69  llback() for thi
1be0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72  s page */.  shor
1bf0: 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20  t int nRef;     
1c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c10: 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66  mber of users of
1c20: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1c30: 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20 2a  PgHdr *pDirty, *
1c40: 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20 2f  pPrevDirty;    /
1c50: 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a 2f  * Dirty pages */
1c60: 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 20  .  u32 notUsed; 
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61 63    /* Buffer spac
1c90: 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
1ca0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1cb0: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
1cc0: 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
1cd0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1ce0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1cf0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1d00: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1d10: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1d20: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1d30: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1d40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1d50: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1d60: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1d70: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1d80: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1d90: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1da0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1db0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1dc0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1dd0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1de0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1df0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1e00: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1e20: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1e30: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1e40: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1e50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1e70: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1e80: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1e90: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1ea0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1eb0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1ec0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1ed0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1ee0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1ef0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1f00: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1f10: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1f20: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1f30: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1f40: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1f50: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1f60: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1f70: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1f80: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1f90: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1fa0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1fb0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1fc0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fd0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1fe0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1ff0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
2000: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
2010: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
2020: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
2030: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
2040: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
2050: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
2060: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
2070: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
2080: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
2090: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
20a0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
20b0: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
20c0: 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f  ,N,X) if( P->xCo
20d0: 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f  dec!=0 ){ P->xCo
20e0: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
20f0: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66  ,D,N,X); }.# def
2100: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
2110: 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e  ,X) ((char*)(P->
2120: 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f  xCodec!=0?P->xCo
2130: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
2140: 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73  ,D,N,X):D)).#els
2150: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
2160: 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f  1(P,D,N,X) /* NO
2170: 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  -OP */.# define 
2180: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
2190: 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69  ((char*)D).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41  Extra])../*.** A
2310: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
2320: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
2330: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2340: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2350: 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  * Pager.errCode 
2360: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
2370: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
2380: 54 45 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c 49  TE_CORRUPT, SQLI
2390: 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f  TE_PROTOCOL.** o
23a0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
23b0: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
23c0: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
23d0: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
23e0: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
23f0: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
2400: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
2410: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
2420: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
2430: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
2440: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
2450: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
2460: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
2470: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
2480: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
2490: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
24a0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
24b0: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
24c0: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
24d0: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
24e0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
24f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65   and sqlite3page
2500: 72 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  r_lookup().** AP
2510: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
2520: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
2530: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
2540: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20  ct Pager {.  u8 
2550: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2570: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
2580: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
2590: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
25a0: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
25b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25c0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
25d0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
25e0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2600: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
2610: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
2620: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
2630: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
2640: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2650: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
2660: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
2670: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2690: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
26a0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
26b0: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
26c0: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26e0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
26f0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
2700: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
2710: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
2720: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2730: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
2740: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
2750: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
2760: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2770: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2780: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2790: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
27a0: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
27d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
27e0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
27f0: 20 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b    u8 full_fsync;
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2810: 20 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   Use F_FULLFSYNC
2820: 20 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20   when available 
2830: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
2860: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
2870: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
2880: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
28a0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
28b0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
28c0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
28f0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2900: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2930: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2940: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2950: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
2960: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2970: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
2980: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
2990: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
29a0: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
29b0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
29c0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
29d0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
29e0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2a10: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2a20: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
2a30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2a40: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
2a50: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
2a60: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
2a70: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
2a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a90: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2aa0: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2ab0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69  rs */.  int dbSi
2ac0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ad0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ae0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
2af0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67  le */.  int orig
2b00: 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  DbSize;         
2b10: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
2b20: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2b30: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74   change */.  int
2b40: 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20   stmtSize;      
2b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b60: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e   of database (in
2b70: 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f   pages) at stmt_
2b80: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
2b90: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2bc0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2bd0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2be0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2bf0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2c00: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2c10: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2c20: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2c30: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2c40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c50: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2c60: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2c70: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2c90: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
2ca0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
2cb0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2cc0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ce0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2cf0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
2d00: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
2d30: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
2d40: 20 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20   int nMaxPage;  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d60: 48 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20  High water mark 
2d70: 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e  of nPage */.  in
2d80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2da0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2db0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2dc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2dd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2df0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2e00: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2e10: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61  cache */.  u8 *a
2e20: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
2e30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
2e40: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
2e50: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2e60: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
2e70: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
2e80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2e90: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2ea0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2eb0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
2ec0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2ed0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2ee0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ef0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2f20: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2f30: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2f50: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2f60: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2f70: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
2f80: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
2f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2fa0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2fb0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2fc0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
2fd0: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
2fe0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2ff0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
3000: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
3010: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
3020: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
3030: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
3040: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
3050: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
3060: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
3070: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
3080: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
3090: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
30a0: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
30b0: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
30c0: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
30d0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
30e0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3100: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
3110: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
3120: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3130: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
3140: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
3150: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3160: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
3170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3180: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69  * List of all di
3190: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  rty pages */.  i
31a0: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
31c0: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
31d0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
31e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
31f0: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
3200: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
3210: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
3220: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
3230: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
3240: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
3250: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
3260: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
3270: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
3280: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
3290: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
32a0: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
32b0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
32c0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
32d0: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
32e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
32f0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
3300: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
3310: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
3320: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3330: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3340: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
3350: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
3360: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3370: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
3380: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
3390: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
33a0: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
33b0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
33c0: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
33d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
33e0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
33f0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3400: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
3410: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
3420: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3430: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
3440: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
3450: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
3460: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
3470: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
3480: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
3490: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
34a0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
34b0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
34c0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
34d0: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
34e0: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
34f0: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
3500: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
3510: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
3520: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 61 73 68  ) */.  int nHash
3530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3540: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
3550: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
3560: 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  le */.  PgHdr **
3570: 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  aHash;          
3580: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
3590: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
35a0: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
35b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35c0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
35d0: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
35e0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
35f0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
3600: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 69  list of pagers i
3610: 6e 20 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f  n this thread */
3620: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
3630: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
3640: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
3650: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3660: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
3670: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  se */.};../*.** 
3680: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
3690: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69  s defined then i
36a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72  ncrement the var
36b0: 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a  iable given in.*
36c0: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  * the argument.*
36d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
36e0: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
36f0: 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a  ST_INCR(x)  x++.
3700: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
3710: 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64  EST_INCR(x).#end
3720: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  if../*.** Journa
3730: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
3740: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
3750: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3760: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3770: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3780: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
3790: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
37a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
37b0: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
37c0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
37d0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
37e0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
37f0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
3800: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
3810: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
3820: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
3830: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
3840: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
3850: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3860: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3870: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3880: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
3890: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
38a0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
38b0: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
38c0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
38d0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
38e0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
38f0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3900: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3910: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3920: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3930: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3940: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
3950: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3960: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3970: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3980: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3990: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
39a0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
39b0: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
39c0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
39d0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
39e0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
39f0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3a00: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3a10: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3a20: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3a30: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3a40: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3a50: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3a60: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3a70: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3a80: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3a90: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3aa0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3ab0: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3ac0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3ad0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3ae0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3af0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3b00: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3b10: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3b20: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3b30: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3b40: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3b50: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3b60: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3b70: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3b80: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3b90: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3ba0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3bb0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3bc0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3bd0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3be0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3bf0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3c00: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3c10: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3c20: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3c30: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3c40: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3c50: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3c60: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3c70: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3c80: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3c90: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3ca0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3cb0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3cc0: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3ce0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3cf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3d00: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3d10: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3d20: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3d30: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3d40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3d50: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3d60: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3d70: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3d80: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3d90: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3da0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3db0: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3dc0: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3dd0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3de0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3df0: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3e00: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3e10: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3e20: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3e30: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3e40: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3e50: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3e60: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3e70: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3e80: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3e90: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3ea0: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3eb0: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3ec0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3ed0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3ee0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3ef0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3f00: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3f10: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3f20: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3f30: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3f40: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3f50: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
3f60: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
3f70: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
3f80: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3f90: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
3fa0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
3fb0: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
3fc0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
3fd0: 0a 23 69 66 6e 64 65 66 20 50 41 47 45 52 5f 53  .#ifndef PAGER_S
3fe0: 45 43 54 4f 52 5f 53 49 5a 45 0a 23 20 64 65 66  ECTOR_SIZE.# def
3ff0: 69 6e 65 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ine PAGER_SECTOR
4000: 5f 53 49 5a 45 20 35 31 32 0a 23 65 6e 64 69 66  _SIZE 512.#endif
4010: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
4020: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
4030: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
4040: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
4050: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
4060: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
4070: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
4080: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
4090: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
40a0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
40b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
40c0: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
40d0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
40e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
40f0: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
4100: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
4110: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
4120: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
4130: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
4140: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
4150: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
4160: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
4170: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
4180: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
4190: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41a0: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
41b0: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41c0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
41d0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
41e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
41f0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
4200: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
4210: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
4220: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
4230: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
4240: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
4250: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
4260: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
4270: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
4280: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
4290: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
42a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
42b0: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
42c0: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
42d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
42e0: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
42f0: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
4300: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
4310: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
4320: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
4330: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
4340: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
4350: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
4360: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4370: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
4380: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
4390: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
43a0: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
43b0: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
43c0: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
43d0: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
43e0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
43f0: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
4400: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
4410: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
4420: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4430: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
4440: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
4450: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4460: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4470: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4480: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4490: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
44a0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
44b0: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
44c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
44d0: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
44e0: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
44f0: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4500: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4510: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4520: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4530: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4540: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4550: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4560: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4570: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4580: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4590: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
45a0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
45b0: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
45c0: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
45d0: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
45e0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
45f0: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4600: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4610: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4620: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4630: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4650: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4660: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4670: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4680: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4690: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
46a0: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
46b0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
46c0: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
46d0: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
46e0: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
46f0: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4700: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4710: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4720: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4730: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4740: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4750: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4760: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4770: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4780: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4790: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
47a0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
47b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
47c0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
47d0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
47e0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
47f0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4800: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4810: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4820: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4830: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4840: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4850: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4860: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4870: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4880: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4890: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
48a0: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
48b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
48c0: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
48d0: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
48e0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
48f0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
4900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4910: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4920: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
4930: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4940: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4950: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4960: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4970: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4980: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4990: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
49a0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
49b0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
49c0: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
49d0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
49e0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
49f0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4a00: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4a10: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
4a20: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
4a30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4a40: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4a50: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4a60: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4a70: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4a80: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4a90: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4aa0: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
4ab0: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
4ac0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
4ad0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
4ae0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
4af0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
4b00: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74  2-bit integer at
4b10: 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27   offset 'offset'
4b20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
4b30: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
4b40: 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e  page header 'p'.
4b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72  .*/.static u32 r
4b60: 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67  etrieve32bits(Pg
4b70: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
4b80: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
4b90: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
4ba0: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
4bb0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
4bc0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
4bd0: 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32  return (ac[0]<<2
4be0: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
4bf0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
4c00: 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ac[3];.}.../*.**
4c10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
4c20: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
4c30: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
4c40: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
4c50: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
4c60: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4c70: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
4c80: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
4c90: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
4ca0: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
4cb0: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
4cc0: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
4cd0: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
4ce0: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
4cf0: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
4d00: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
4d10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
4d20: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
4d30: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
4d40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
4d50: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
4d60: 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c  E_CORRUPT or SQL
4d70: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a 2a  ITE_PROTOCOL,.**
4d80: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
4d90: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41  es persistent. A
4da0: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ll subsequent AP
4db0: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
4dc0: 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d  Pager.** will im
4dd0: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4de0: 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20   the same error 
4df0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4e00: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
4e10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
4e20: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
4e30: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
4e40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
4e50: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
4e60: 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d  _FULL || pPager-
4e70: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
4e80: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a 20 20  _OK );.  if( .  
4e90: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55    rc2==SQLITE_FU
4ea0: 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  LL ||.    rc2==S
4eb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4ec0: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43     rc2==SQLITE_C
4ed0: 4f 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63  ORRUPT ||.    rc
4ee0: 32 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  2==SQLITE_PROTOC
4ef0: 4f 4c 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  OL.  ){.    pPag
4f00: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4f10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4f20: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
4f30: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4f40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
4f50: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
4f60: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
4f70: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
4f80: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
4f90: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
4fa0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
4fb0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  0;.  int i;.  un
4fc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
4fd0: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
4fe0: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
4ff0: 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f  ATA(pPage);.  fo
5000: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
5010: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5020: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
5030: 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74   = (hash+i)^pDat
5040: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
5050: 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn hash;.}../*.*
5060: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5070: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5080: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5090: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
50a0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
50b0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
50c0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
50d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
50e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
50f0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5100: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5110: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5120: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5130: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5140: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5150: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5160: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5170: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5180: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5190: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
51a0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
51b0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
51c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
51d0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
51e0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
51f0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
5200: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
5210: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
5220: 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  se.#define CHECK
5230: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
5240: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
5250: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
5260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
5270: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
5280: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
5290: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
52a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
52b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
52c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
52d0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
52e0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
52f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
5300: 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20  oc(). *pzMaster 
5310: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69  is.** set to poi
5320: 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79  nt at the memory
5330: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
5340: 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
5350: 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69  ler must.** sqli
5360: 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  teFree() *pzMast
5370: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
5380: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5390: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
53a0: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
53b0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
53c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
53d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
53e0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
53f0: 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72  rnal(OsFile *pJr
5400: 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73  nl, char **pzMas
5410: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
5420: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
5430: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
5440: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  m;.  int i;.  un
5450: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
5460: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
5470: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5480: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
5490: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
54a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
54b0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
54c0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
54d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
54e0: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
54f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5500: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
5510: 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20   szJ-16);.  if( 
5520: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5530: 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72  return rc;. .  r
5540: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5550: 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  Jrnl, &len);.  i
5560: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5570: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5580: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5590: 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b  (pJrnl, &cksum);
55a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
55b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
55c0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
55d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
55e0: 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28  Magic, 8);.  if(
55f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5600: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
5610: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5620: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
5630: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5640: 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a  sSeek(pJrnl, szJ
5650: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
5660: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5670: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70  return rc;..  *p
5680: 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20  zMaster = (char 
5690: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c  *)sqliteMalloc(l
56a0: 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70  en+1);.  if( !*p
56b0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  zMaster ){.    r
56c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
56d0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
56e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
56f0: 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c  nl, *pzMaster, l
5700: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5720: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61  sqliteFree(*pzMa
5730: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
5740: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ster = 0;.    re
5750: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
5760: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
5770: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
5780: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5790: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
57a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
57b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28  {.    cksum -= (
57c0: 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20  *pzMaster)[i];. 
57d0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
57e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
57f0: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
5800: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
5810: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
5820: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
5830: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
5840: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5850: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
5860: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
5870: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
5880: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
5890: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
58a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
58b0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
58c0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
58d0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
58e0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46    */.    sqliteF
58f0: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
5900: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
5910: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
5920: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d  (*pzMaster)[len]
5930: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
5940: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5950: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
5960: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
5970: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5980: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
5990: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
59a0: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
59b0: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
59c0: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
59d0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
59e0: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
59f0: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
5a00: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
5a10: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
5a20: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
5a30: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
5a40: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
5a50: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5ac0: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
5b10: 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72  tic int seekJour
5b20: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5b30: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
5b40: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
5b50: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5b60: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
5b70: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
5b80: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
5b90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
5ba0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
5bb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5bc0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5bd0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
5be0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
5bf0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
5c00: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
5c10: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
5c20: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5c30: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
5c40: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
5c50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
5c60: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
5c70: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
5c80: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f  ournalOff);.}../
5c90: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5ca0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5cb0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
5cc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
5cd0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
5ce0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
5cf0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
5d00: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
5d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
5d20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
5d30: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
5d40: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
5d50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5d60: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
5d70: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
5d80: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
5d90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
5da0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
5db0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
5dc0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
5dd0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
5de0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
5df0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
5e00: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
5e10: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
5e20: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
5e30: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
5e40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
5e50: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
5e60: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
5e70: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
5e80: 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f  urnal..** .** Fo
5e90: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
5ea0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20  AL_HDR_SZ - 24) 
5eb0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
5ec0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5ed0: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
5ee0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5ef0: 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61  er){.  char zHea
5f00: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
5f10: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a  nalMagic)+16];..
5f20: 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a    int rc = seekJ
5f30: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
5f40: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
5f50: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
5f60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
5f70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f80: 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Off;.  if( pPage
5f90: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
5fa0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
5fb0: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
5fc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b  ger->journalHdr;
5fd0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
5fe0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
5ff0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6000: 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d  er);..  /* FIX M
6010: 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f  E: .  **.  ** Po
6020: 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67  ssibly for a pag
6030: 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  er not in no-syn
6040: 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
6050: 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64  nal magic should
6060: 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69   not.  ** be wri
6070: 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20  tten until nRec 
6080: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  is filled in as 
6090: 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e  part of next syn
60a0: 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a  cJournal(). .  *
60b0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20  *.  ** Actually 
60c0: 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20  maybe the whole 
60d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
60e0: 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64  hould be delayed
60f0: 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a   until that.  **
6100: 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62   point. Think ab
6110: 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  out this..  */. 
6120: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
6130: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6140: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6150: 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65  agic));.  /* The
6160: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
6170: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
6180: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
6190: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
61a0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
61b0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
61c0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30  ager->noSync ? 0
61d0: 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a  xffffffff : 0);.
61e0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
61f0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
6200: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
6210: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
6220: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
6230: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
6240: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6250: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6260: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6270: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
6280: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6290: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
62a0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
62b0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
62c0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
62d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
62e0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ], pPager->dbSiz
62f0: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
6300: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
6310: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
6320: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
6330: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6340: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6350: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
6360: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52  torSize);.  IOTR
6370: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
6380: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
6390: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
63a0: 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  lHdr, sizeof(zHe
63b0: 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73  ader))).  rc = s
63c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
63d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
63e0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
63f0: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6400: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6410: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6420: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6430: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6440: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6450: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
6460: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6470: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6480: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6490: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54  TE_OK ){.    IOT
64a0: 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20  RACE(("JTAIL %p 
64b0: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
64c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
64d0: 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d  Off-1)).    rc =
64e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
64f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
6500: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
6510: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6520: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6540: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
6550: 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20  d, "\000", 1);. 
6560: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6570: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6580: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6590: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
65a0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
65b0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
65c0: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
65d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
65e0: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
65f0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6600: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
6610: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
6620: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
6630: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
6640: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
6650: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
6660: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
6670: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
6680: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
6690: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
66a0: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
66b0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
66c0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
66d0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
66e0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
66f0: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6700: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6710: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
6720: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
6730: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
6740: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
6750: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
6760: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
6770: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
6780: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6790: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
67a0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
67b0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
67c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
67d0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
67e0: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
67f0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
6800: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
6810: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
6820: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
6830: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
6840: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
6850: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
6860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6870: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
6880: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6890: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
68a0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
68b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
68c0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
68d0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
68e0: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
68f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
6900: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
6910: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
6920: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
6930: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
6940: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6950: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6960: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6970: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
6980: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
6990: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
69a0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
69b0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
69c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
69d0: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
69e0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
69f0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
6a00: 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20  eof(aMagic));.  
6a10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6a20: 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  rc;..  if( memcm
6a30: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
6a40: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6a50: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
6a60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6a70: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
6a80: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6a90: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63  ager->jfd, pNRec
6aa0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6ab0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6ac0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6ad0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
6ae0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6af0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6b00: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6b10: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6b20: 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  fd, pDbSize);.  
6b30: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6b40: 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  rc;..  /* Update
6b50: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
6b60: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
6b70: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
6b80: 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72   by .  ** the pr
6b90: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
6ba0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
6bb0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
6bc0: 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65   was.  ** create
6bd0: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
6be0: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
6bf0: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
6c00: 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65  utine.  ** is be
6c10: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
6c20: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
6c30: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
6c40: 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  al value.  ** of
6c50: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
6c60: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
6c70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
6c80: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
6c90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6ca0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75  (pPager->jfd, (u
6cb0: 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65  32 *)&pPager->se
6cc0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
6cd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ce0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
6cf0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
6d00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6d10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6d20: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6d30: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
6d40: 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72  nalOff);.  retur
6d50: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
6d60: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
6d70: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
6d80: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
6d90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
6da0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
6db0: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
6dc0: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
6dd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6de0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
6df0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
6e00: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
6e10: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
6e20: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
6e30: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
6e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
6e50: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
6e60: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
6e70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
6e80: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
6e90: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
6ea0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
6eb0: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
6ec0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
6ed0: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
6ee0: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
6ef0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
6f00: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
6f10: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
6f20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
6f30: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
6f40: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
6f50: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
6f60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6f70: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
6f80: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
6f90: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
6fa0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
6fb0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
6fc0: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
6fd0: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
6fe0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
6ff0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
7000: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
7010: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
7020: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7030: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
7040: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
7050: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
7060: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
7070: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
7080: 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  i; .  u32 cksum 
7090: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
70a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
70b0: 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20  Magic)+2*4];..  
70c0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
70d0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
70e0: 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r) return SQLITE
70f0: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
7100: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
7110: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
7120: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
7130: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
7140: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
7150: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
7160: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
7170: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
7180: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
7190: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
71a0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
71b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
71c0: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
71d0: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
71e0: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
71f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
7200: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
7210: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
7220: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
7230: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
7240: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
7250: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
7260: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7270: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7280: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
7290: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
72a0: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
72b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
72c0: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
72d0: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
72e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
72f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7300: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7310: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7320: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
7330: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7340: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7350: 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73  rc;..  put32bits
7360: 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70  (zBuf, len);.  p
7370: 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34  ut32bits(&zBuf[4
7380: 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d  ], cksum);.  mem
7390: 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a  cpy(&zBuf[8], aJ
73a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
73b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
73c0: 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c));.  rc = sqli
73d0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
73e0: 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b  r->jfd, zBuf, 8+
73f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7400: 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72  agic));.  pPager
7410: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
7420: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
7430: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7440: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
7450: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
7460: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
7470: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
7480: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
7490: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
74a0: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
74b0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
74c0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
74d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
74e0: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
74f0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
7500: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
7510: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
7520: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
7530: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
7540: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
7550: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
7560: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
7570: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
7580: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
7590: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
75a0: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
75b0: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
75c0: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
75d0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
75e0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
75f0: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
7600: 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74  Pg->inStmt ) ret
7610: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
7620: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  Pg->pPrevStmt==0
7630: 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74   && pPg->pNextSt
7640: 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  mt==0 );.  pPg->
7650: 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20  pPrevStmt = 0;. 
7660: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74   if( pPager->pSt
7670: 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  mt ){.    pPager
7680: 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  ->pStmt->pPrevSt
7690: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  mt = pPg;.  }.  
76a0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
76b0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
76c0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
76d0: 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e  = pPg;.  pPg->in
76e0: 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74  Stmt = 1;.}.stat
76f0: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d  ic void page_rem
7700: 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
7710: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
7720: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74    if( !pPg->inSt
7730: 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  mt ) return;.  i
7740: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  f( pPg->pPrevStm
7750: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7760: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7770: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20  >pNextStmt==pPg 
7780: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
7790: 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74  vStmt->pNextStmt
77a0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
77b0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
77c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
77d0: 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20  ger->pStmt==pPg 
77e0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
77f0: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d  er->pStmt = pPg-
7800: 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a  >pNextStmt;.  }.
7810: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
7820: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
7830: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  rt( pPg->pNextSt
7840: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70  mt->pPrevStmt==p
7850: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
7860: 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53  NextStmt->pPrevS
7870: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  tmt = pPg->pPrev
7880: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Stmt;.  }.  pPg-
7890: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
78a0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
78b0: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   = 0;.  pPg->inS
78c0: 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  tmt = 0;.}../*.*
78d0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
78e0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
78f0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
7900: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
7910: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
7920: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
7930: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
7940: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
7950: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
7960: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
7970: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
7980: 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  p;.  if( pPager-
7990: 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75  >aHash==0 ) retu
79a0: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67  rn 0;.  p = pPag
79b0: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26  er->aHash[pgno &
79c0: 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
79d0: 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  1)];.  while( p 
79e0: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
79f0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
7a00: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
7a10: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7a20: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
7a30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
7a40: 2a 2a 20 4f 6e 63 65 20 61 6c 6c 20 6c 6f 63 6b  ** Once all lock
7a50: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f  s have been remo
7a60: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 74 68 65  abase file, othe
7a80: 72 0a 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f  r.** processes o
7a90: 72 20 74 68 72 65 61 64 73 20 6d 69 67 68 74 20  r threads might 
7aa0: 63 68 61 6e 67 65 20 74 68 65 20 66 69 6c 65 2e  change the file.
7ab0: 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 61    So make sure a
7ac0: 6c 6c 20 6f 66 0a 2a 2a 20 6f 75 72 20 69 6e 74  ll of.** our int
7ad0: 65 72 6e 61 6c 20 63 61 63 68 65 20 69 73 20 69  ernal cache is i
7ae0: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
7af0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7b00: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
7b10: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 4d  Pager){.  if( !M
7b20: 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
7b30: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
7b40: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
7b50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
7b60: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 49  Size = -1;.    I
7b70: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7b80: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7b90: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
7ba0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
7bb0: 43 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  CK;.  assert( pP
7bc0: 61 67 65 72 2d 3e 70 41 6c 6c 3d 3d 30 20 29 3b  ager->pAll==0 );
7bd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  .}.../*.** Unloc
7be0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  k the database a
7bf0: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d  nd clear the in-
7c00: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
7c10: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
7c20: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
7c30: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
7c40: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
7c50: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
7c60: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
7c70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
7c80: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
7c90: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
7ca0: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
7cb0: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
7cc0: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
7cd0: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
7ce0: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
7cf0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
7d00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7d10: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
7d20: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61  pNext;.  if( pPa
7d30: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
7d40: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67  eturn;.  for(pPg
7d50: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
7d60: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
7d70: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
7d80: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
7d90: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
7da0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46    }.  pPager->pF
7db0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
7dc0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
7dd0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7de0: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
7df0: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
7e00: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
7e10: 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65   0;.  sqliteFree
7e20: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
7e30: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
7e40: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7e50: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28  aHash = 0;.  if(
7e60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7e70: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7e80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
7e90: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
7ea0: 65 72 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  er);.  }.  pager
7eb0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
7ec0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
7ed0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
7ee0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
7ef0: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
7f00: 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
7f10: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
7f20: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  ) );.}../*.** Wh
7f30: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7f40: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7f50: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7f60: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7f70: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7f80: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7f90: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7fa0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7fb0: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7fc0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7fd0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7fe0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7ff0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
8000: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
8010: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
8020: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
8030: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
8040: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
8050: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
8060: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
8070: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
8080: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
8090: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
80a0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
80b0: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
80c0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
80d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
80e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
80f0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
8100: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
8110: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
8120: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
8130: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
8140: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
8150: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8170: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
8180: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
8190: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
81a0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
81b0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
81c0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
81d0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
81e0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
81f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
8200: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8220: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
8230: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
8240: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
8250: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
8260: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
8270: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
8280: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
8290: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
82a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
82b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
82c0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
82d0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
82e0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
82f0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
8300: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
8310: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
8320: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
8330: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
8340: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8350: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8360: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8370: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
8380: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
8390: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
83a0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
83b0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
83c0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
83d0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
83e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
83f0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8400: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8410: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8420: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8430: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8440: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8450: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
8460: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
8470: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
8480: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
8490: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
84a0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
84b0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
84c0: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
84d0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
84e0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
84f0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8500: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
8510: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8520: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8530: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
8540: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
8550: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
8560: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
8570: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
8580: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
8590: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
85a0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
85b0: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
85c0: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
85d0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
85e0: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
85f0: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
8600: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
8610: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
8620: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
8630: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
8640: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
8650: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
8660: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
8670: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
8680: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
8690: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
86a0: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
86b0: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
86c0: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
86d0: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
86e0: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
86f0: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
8700: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
8710: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
8720: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
8730: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
8740: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
8750: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
8760: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
8770: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
8780: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
8790: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
87a0: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
87b0: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
87c0: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
87d0: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
87e0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
87f0: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
8800: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
8810: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
8820: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
8830: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
8840: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
8850: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
8860: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
8870: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
8880: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
8890: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
88a0: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
88b0: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
88c0: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
88d0: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
88e0: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
88f0: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
8900: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
8910: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
8920: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
8930: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
8940: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
8950: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
8960: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
8970: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
8980: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
8990: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
89a0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
89b0: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
89c0: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
89d0: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
89e0: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
89f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
8a00: 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  um;.}../* Forwar
8a10: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
8a20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
8a30: 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a  eClean(PgHdr*);.
8a40: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
8a50: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74  ngle page from t
8a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8a70: 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64  opened on file d
8a80: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64  escriptor.** jfd
8a90: 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73  .  Playback this
8aa0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   one page..**.**
8ab0: 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20   If useCksum==0 
8ac0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f  it means this jo
8ad0: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75  urnal does not u
8ae0: 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43  se checksums.  C
8af0: 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20  hecksums.** are 
8b00: 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74  not used in stat
8b10: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62  ement journals b
8b20: 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74  ecause statement
8b30: 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74   journals do not
8b40: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76  .** need to surv
8b50: 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  ive power failur
8b60: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
8b70: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
8b80: 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20  _one_page(Pager 
8b90: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
8ba0: 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73  *jfd, int useCks
8bb0: 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  um){.  int rc;. 
8bc0: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8be0: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
8bf0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
8c00: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
8c30: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
8c40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
8c50: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c70: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
8c80: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
8c90: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
8ca0: 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  a = (u8 *)pPager
8cb0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f  ->pTmpSpace;   /
8cc0: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
8cd0: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
8ce0: 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75  /* useCksum shou
8cf0: 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74  ld be true for t
8d00: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
8d10: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20  and false for.  
8d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
8d30: 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74  rnals.  Verify t
8d40: 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61  hat this is alwa
8d50: 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f  ys the case.  */
8d60: 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d  .  assert( jfd =
8d70: 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50  = (useCksum ? pP
8d80: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
8d90: 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61  er->stfd) );.  a
8da0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a  ssert( aData );.
8db0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
8dc0: 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a  ts(jfd, &pgno);.
8dd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8de0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8df0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8e00: 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61  sRead(jfd, aData
8e10: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8e20: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8e30: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8e40: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
8e50: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
8e60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
8e70: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
8e90: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8ea0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
8eb0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
8ec0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
8ed0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
8ee0: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
8ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8f00: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8f10: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8f20: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8f30: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
8f40: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
8f50: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
8f60: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
8f70: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
8f80: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
8f90: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8fa0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8fb0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8fc0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8fd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8fe0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8ff0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
9000: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
9010: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9020: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9030: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
9040: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
9050: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
9060: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
9070: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9080: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9090: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
90a0: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
90b0: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
90c0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
90d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
90e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
90f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
9100: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
9110: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
9120: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9130: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
9140: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9150: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
9160: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
9170: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
9180: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
9190: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
91a0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
91b0: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
91c0: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
91d0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
91e0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
91f0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
9200: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
9210: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
9220: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
9230: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
9240: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
9250: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
9260: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
9270: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
9280: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
9290: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
92a0: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
92b0: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
92c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
92d0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
92e0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
92f0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
9300: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
9310: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
9320: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
9330: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
9340: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
9350: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
9360: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
9370: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
9380: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
9390: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
93a0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
93b0: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
93c0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
93d0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
93e0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
93f0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
9400: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
9410: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
9420: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
9430: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
9440: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
9450: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
9460: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
9470: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
9480: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
9490: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
94a0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
94b0: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
94c0: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
94d0: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
94e0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
94f0: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
9500: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
9510: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
9520: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9530: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
9540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
9550: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
9560: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
9570: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
9580: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
9590: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
95a0: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
95b0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
95c0: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
95d0: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
95e0: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
95f0: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
9600: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9610: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9620: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9630: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9640: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
9650: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
9660: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
9670: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
9680: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
9690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
96a0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
96b0: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
96c0: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
96d0: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
96e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
96f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9700: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9710: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9720: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9730: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9740: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9750: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
9760: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9770: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
9780: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
9790: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
97a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
97b0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
97c0: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
97d0: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
97e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
97f0: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
9800: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
9810: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
9820: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
9830: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
9840: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
9850: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
9860: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
9870: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
9880: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
9890: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
98a0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
98b0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
98c0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
98d0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
98e0: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
98f0: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9900: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9910: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9920: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
9930: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
9940: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
9950: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
9960: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
9970: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9980: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9990: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
99a0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
99b0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
99c0: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
99d0: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
99e0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
99f0: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
9a00: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9a10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9a20: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
9a30: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
9a40: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
9a50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f  );.#endif.    CO
9a60: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
9a70: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
9a80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9a90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
9aa0: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
9ab0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
9ac0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9ad0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
9ae0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
9af0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
9b00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9b10: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
9b20: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
9b30: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
9b40: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
9b50: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
9b60: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
9b80: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
9b90: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
9ba0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9bb0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
9bc0: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
9bd0: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  hild journals..*
9be0: 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d  * To tell if a m
9bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
9c00: 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68  n be deleted, ch
9c10: 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74  eck to each of t
9c20: 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20  he.** children. 
9c30: 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   If all children
9c40: 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73   are either miss
9c50: 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65  ing or do not re
9c60: 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66  fer to.** a diff
9c70: 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75  erent master jou
9c80: 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  rnal, then this 
9c90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
9ca0: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  an be deleted..*
9cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
9cc0: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e  er_delmaster(con
9cd0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
9ce0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
9cf0: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
9d00: 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61   0;.  OsFile *ma
9d10: 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ster = 0;.  char
9d20: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
9d30: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
9d40: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
9d50: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
9d60: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
9d70: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
9d80: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9d90: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
9da0: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
9db0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
9dc0: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
9dd0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
9de0: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
9df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
9e00: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
9e10: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
9e20: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
9e30: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
9e40: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
9e50: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
9e60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9e70: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9e80: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
9e90: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
9ea0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9eb0: 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c  FileSize(master,
9ec0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
9ed0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9ee0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9ef0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
9f00: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
9f10: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
9f20: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
9f30: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
9f40: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
9f50: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
9f60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9f70: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
9f80: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
9f90: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
9fa0: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
9fb0: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
9fc0: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
9fd0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
9fe0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
9ff0: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
a000: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
a010: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
a020: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a030: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a040: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a050: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
a060: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a070: 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  (master, zMaster
a080: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
a090: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
a0a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a0b0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a0c0: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
a0d0: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
a0e0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
a0f0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
a100: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
a110: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
a120: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
a130: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
a140: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
a150: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
a160: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
a170: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
a180: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
a190: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
a1a0: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
a1b0: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
a1c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
a1d0: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
a1e0: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
a1f0: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
a200: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a210: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
a220: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a         OsFile *j
a230: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
a240: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
a250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a260: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
a270: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
a280: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
a290: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a2b0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
a2c0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
a2d0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
a2e0: 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c  rJournal(journal
a2f0: 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  , &zMasterPtr);.
a300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
a310: 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29  sClose(&journal)
a320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a340: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
a350: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
a360: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
a370: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d  c = zMasterPtr!=
a380: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
a390: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
a3a0: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ==0;.        sql
a3b0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
a3c0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tr);.        if(
a3d0: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
a3e0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
a3f0: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
a400: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
a410: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
a420: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
a430: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a440: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a450: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
a460: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
a470: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
a480: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
a490: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
a4a0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
a4b0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
a4c0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
a4d0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
a4e0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
a4f0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
a500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a510: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
a520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a530: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
a540: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a550: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a560: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a570: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a580: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a590: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a5a0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a5b0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a5c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a5d0: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a5e0: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a5f0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
a600: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
a610: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
a620: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
a630: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
a640: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
a650: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
a660: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
a670: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
a680: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
a690: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
a6a0: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
a6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a6c0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
a6d0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a6e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
a6f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a700: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
a710: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
a720: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
a730: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
a740: 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e  *zBuf = pPager->
a750: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
a760: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
a770: 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a  e for one page *
a780: 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
a790: 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65  dirty ) continue
a7a0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70  ;.    if( (int)p
a7b0: 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
a7c0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
a7d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a7e0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
a7f0: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
a800: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50  ageSize*(i64)(pP
a810: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
a820: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a830: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a840: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a850: 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  ad(pPager->fd, z
a860: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
a870: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
a880: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45        TRACE3("RE
a890: 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
a8a0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
a8b0: 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
a8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a8d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f   break;.      CO
a8e0: 44 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75  DEC1(pPager, zBu
a8f0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
a900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a910: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
a920: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
a930: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
a940: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
a950: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
a960: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a970: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
a980: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
a990: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
a9a0: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
a9b0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a9c0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
a9d0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a9e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
a9f0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
aa00: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
aa10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
aa20: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
aa30: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
aa40: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
aa50: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
aa60: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
aa70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aa80: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
aa90: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
aaa0: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
aab0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
aac0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
aad0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
aae0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
aaf0: 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dif.  }.  pPager
ab00: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
ab10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ab20: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
ab30: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
ab40: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
ab50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ab60: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
ab70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ab80: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
ab90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
aba0: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  nt nPage){.  ass
abb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
abc0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
abd0: 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  IVE );.  return 
abe0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
abf0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
ac00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
ac10: 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f  i64)nPage);.}../
ac20: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
ac30: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
ac40: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
ac50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
ac60: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
ac70: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
ac80: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
ac90: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
aca0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
acb0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
acc0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
acd0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
ace0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
acf0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
ad00: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
ad10: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
ad20: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ad30: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
ad40: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
ad50: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
ad60: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
ad70: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
ad80: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
ad90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
ada0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
adb0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
adc0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
add0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
ade0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
adf0: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
ae00: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
ae10: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
ae20: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
ae30: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
ae40: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ae50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ae60: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
ae70: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
ae80: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
ae90: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
aea0: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
aeb0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
aec0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
aed0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
aee0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
aef0: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
af00: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
af10: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
af20: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
af30: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
af40: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
af50: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
af60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
af70: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
af80: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
af90: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
afa0: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
afb0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
afc0: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
afe0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
aff0: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
b000: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
b010: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
b020: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
b030: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
b040: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
b050: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
b060: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
b070: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
b080: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
b090: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
b0a0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
b0b0: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
b0c0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
b0d0: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
b0e0: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
b0f0: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
b100: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
b110: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
b120: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
b130: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
b140: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
b150: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b160: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
b170: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
b180: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
b190: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
b1a0: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
b1b0: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
b1c0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
b1d0: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
b1e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
b1f0: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
b200: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
b210: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
b220: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
b230: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b240: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
b250: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
b260: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
b270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
b280: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
b290: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
b2a0: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
b2b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
b2c0: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
b2d0: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
b2e0: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
b2f0: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
b300: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
b310: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
b320: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
b330: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
b340: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
b350: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
b360: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
b370: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
b380: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
b390: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
b3a0: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
b3b0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
b3c0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b3d0: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
b3e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
b3f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
b400: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
b410: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
b420: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
b430: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
b440: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
b450: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
b460: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
b470: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
b480: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
b490: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
b4a0: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
b4b0: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
b4c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
b4d0: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
b4e0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
b4f0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
b500: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
b510: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
b520: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
b530: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b540: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
b550: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
b560: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
b570: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
b580: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
b590: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
b5a0: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
b5b0: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
b5c0: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
b5d0: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
b5e0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
b5f0: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
b600: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
b610: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
b620: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
b630: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
b640: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
b650: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
b660: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
b670: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
b680: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
b690: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
b6a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
b6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b6c0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
b6d0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b6e0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
b6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b700: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b710: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
b720: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b740: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b750: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
b760: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b780: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b790: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
b7a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
b7b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
b7c0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
b7d0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
b800: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
b810: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
b820: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
b830: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
b840: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
b850: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
b860: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
b870: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
b880: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
b890: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
b8a0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
b8b0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
b8c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
b8d0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b8e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b8f0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b900: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
b910: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b920: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
b930: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b940: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
b950: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
b960: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b970: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
b980: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
b990: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b9a0: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
b9b0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
b9c0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
b9d0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
b9e0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
b9f0: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
ba00: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
ba10: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
ba20: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
ba30: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
ba40: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
ba50: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
ba60: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
ba70: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
ba80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
ba90: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
baa0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
bab0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
bac0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
bad0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
bae0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
baf0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bb00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bb10: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
bb20: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
bb30: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
bb40: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
bb50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bb60: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
bb70: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
bb80: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
bb90: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
bba0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
bbb0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
bbc0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
bbd0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
bbe0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
bbf0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
bc00: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
bc10: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
bc20: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
bc30: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
bc40: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
bc50: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bc60: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
bc70: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
bc80: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
bc90: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
bca0: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
bcb0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
bcc0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
bcd0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
bce0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
bcf0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
bd00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
bd10: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
bd20: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
bd30: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
bd40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bd50: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
bd60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
bd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
bd80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bd90: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
bda0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
bdc0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
bdd0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
bde0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
bdf0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
be00: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
be10: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
be20: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
be30: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
be40: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
be50: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
be60: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
be70: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
be80: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
be90: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
bea0: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
beb0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
bec0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bed0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
bee0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
bef0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
bf00: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
bf10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
bf20: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
bf30: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
bf40: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
bf50: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
bf60: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
bf70: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
bf80: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
bf90: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
bfa0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
bfb0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
bfc0: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
bfd0: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
bfe0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
bff0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
c000: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
c010: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
c020: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c030: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
c040: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
c050: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c060: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
c070: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
c080: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
c090: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
c0a0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
c0b0: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
c0c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c0d0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
c0e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c0f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
c100: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
c110: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c120: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
c130: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
c140: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
c150: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
c160: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
c170: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
c180: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
c190: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
c1a0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
c1b0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
c1c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
c1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c1e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
c1f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c200: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
c210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c220: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c230: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
c240: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c250: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c260: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
c270: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
c280: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ollback a hot jo
c290: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 65 20  urnal, then the 
c2a0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
c2b0: 20 20 20 2a 2a 20 69 73 20 70 72 6f 62 61 62 6c     ** is probabl
c2c0: 79 20 6e 6f 74 20 72 65 63 6f 76 65 72 61 62 6c  y not recoverabl
c2d0: 65 2e 20 20 52 65 74 75 72 6e 20 43 4f 52 52 55  e.  Return CORRU
c2e0: 50 54 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  PT..          */
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c300: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
c310: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
c320: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c340: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
c350: 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
c360: 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
c370: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
c380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c390: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
c3a0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
c3b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
c3c0: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
c3d0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
c3e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
c3f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
c400: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
c410: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
c420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
c430: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
c440: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
c450: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
c460: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c470: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
c480: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
c490: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c4a0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
c4b0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
c4c0: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
c4d0: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
c4e0: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
c4f0: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
c500: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
c510: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c520: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
c530: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
c540: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
c550: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c560: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c570: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c580: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c590: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
c5a0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c5b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c5c0: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c5d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c5e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
c5f0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
c600: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c620: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
c630: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
c640: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
c650: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
c660: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
c670: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
c680: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c690: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
c6a0: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
c6b0: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
c6c0: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
c6d0: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
c6e0: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
c6f0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
c700: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
c710: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
c720: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
c730: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
c740: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
c750: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
c760: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
c770: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
c780: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
c790: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c7b0: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
c7c0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
c7d0: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
c800: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
c810: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
c820: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
c830: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c840: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
c850: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c870: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c880: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
c890: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c8a0: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
c8b0: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
c8c0: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
c8d0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
c8e0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
c8f0: 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
c900: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c910: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c920: 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
c930: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
c940: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
c950: 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
c960: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
c970: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c980: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69  written.  ** thi
c990: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
c9a0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20  saction, or the 
c9b0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c9c0: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
c9d0: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
c9e0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
c9f0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
ca00: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
ca10: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
ca20: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
ca30: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
ca40: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
ca50: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
ca60: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
ca70: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
ca80: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
ca90: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
caa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
cab0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
cac0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
cad0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
cae0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
caf0: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
cb00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
cb10: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
cb20: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
cb30: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
cb40: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
cb50: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
cb60: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
cb70: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cb80: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
cb90: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
cba0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
cbb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
cbc0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
cbd0: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
cbe0: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
cbf0: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
cc00: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
cc10: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
cc20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cc30: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
cc40: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
cc50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
cc60: 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
cc70: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
cc80: 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
cc90: 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
cca0: 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
ccb0: 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
ccc0: 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
ccd0: 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
cce0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
ccf0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
cd00: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
cd10: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
cd20: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
cd30: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
cd40: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
cd50: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
cd60: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
cd70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cd80: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
cd90: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
cda0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
cdb0: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
cdc0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cdd0: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
cde0: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
cdf0: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
ce00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ce10: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
ce20: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
ce30: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
ce40: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
ce50: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
ce60: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
ce70: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
ce80: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
ce90: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
cea0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
ceb0: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
cec0: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
ced0: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
cee0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
cef0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
cf00: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
cf10: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
cf20: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
cf30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
cf40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
cf50: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
cf60: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
cf70: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
cf80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cf90: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
cfa0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
cfb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cfc0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
cfd0: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
cfe0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
cff0: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
d000: 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e  .  assert( JOURN
d010: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d020: 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  )<(pPager->pageS
d030: 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c  ize+8) );.  whil
d040: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d050: 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66  alOff <= (hdrOff
d060: 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  -(pPager->pageSi
d070: 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63  ze+8)) ){.    rc
d080: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d090: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d0a0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d0b0: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
d0c0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d0d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d0e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d0f0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d100: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
d110: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d120: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
d130: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
d140: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d150: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
d160: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
d170: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d180: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d190: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
d1a0: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
d1b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d1c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d1e0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
d1f0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d200: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
d210: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
d220: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
d230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d240: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
d250: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
d260: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
d270: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
d280: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d290: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
d2a0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d2b0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d2c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d2d0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
d2e0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d2f0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
d300: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d310: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d320: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d330: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
d340: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d350: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
d360: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
d370: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
d380: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
d390: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
d3a0: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
d3b0: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
d3c0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
d3d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
d3e0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
d3f0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
d400: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
d410: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
d420: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d430: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
d440: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d450: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
d460: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
d470: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
d480: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
d490: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
d4a0: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
d4b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
d4c0: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
d4d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d4e0: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
d4f0: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
d500: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
d510: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
d520: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
d530: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
d540: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
d550: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
d560: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
d570: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
d580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d590: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
d5a0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
d5b0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
d5d0: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
d5e0: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
d5f0: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
d600: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
d610: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
d620: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d630: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d640: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d650: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
d660: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
d670: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
d690: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
d6a0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
d6b0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
d6c0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
d6d0: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
d6e0: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
d6f0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
d700: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
d710: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
d720: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
d730: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
d740: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
d750: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
d760: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
d770: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
d780: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
d790: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
d7a0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
d7b0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d7c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d7d0: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
d7e0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
d7f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
d800: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
d820: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
d830: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
d840: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
d850: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
d860: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
d870: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
d880: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
d890: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
d8a0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
d8b0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
d8c0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
d8d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d8e0: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
d8f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
d900: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
d910: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
d920: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
d930: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
d940: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d950: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
d960: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
d970: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
d980: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
d990: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
d9a0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
d9b0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
d9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9d0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
d9e0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d9f0: 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c  set_safety_level
da00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
da10: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
da20: 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
da30: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
da40: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
da50: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
da60: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
da70: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
da80: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
da90: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
daa0: 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73  _fsync = full_fs
dab0: 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ync;.  if( pPage
dac0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
dad0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
dae0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
daf0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
db00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
db10: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
db20: 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
db30: 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
db40: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
db50: 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
db60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
db70: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
db80: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
db90: 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
dba0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
dbb0: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
dbc0: 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
dbd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
dbe0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
dbf0: 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61  e.  Write the na
dc00: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  me of the file i
dc10: 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28 7a 46  nto zFile.** (zF
dc20: 69 6c 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ile must be at l
dc30: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
dc40: 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20  NAME_SIZE bytes 
dc50: 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a  long.)  Write.**
dc60: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
dc70: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
dc80: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
dc90: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
dca0: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
dcb0: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
dcc0: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
dcd0: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
dce0: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
dcf0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
dd00: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
dd10: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
dd20: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
dd30: 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46  pentemp(char *zF
dd40: 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 46  ile, OsFile **pF
dd50: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
dd60: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  8;.  int rc;.#if
dd70: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
dd80: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
dd90: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
dda0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
ddb0: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
ddc0: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64  ly */.#endif.  d
ddd0: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
dde0: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ddf0: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
de00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de10: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
de20: 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a  zFile, pFd, 1);.
de30: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
de40: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
de50: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
de60: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
de70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
de80: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
de90: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
dea0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
deb0: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
dec0: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
ded0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
dee0: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
def0: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
df00: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
df10: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
df20: 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
df30: 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  get() and is onl
df40: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
df50: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
df60: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
df70: 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65  sing sqlite3page
df80: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  r_unref()..**.**
df90: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
dfa0: 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
dfb0: 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
dfc0: 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
dfd0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
dfe0: 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
dff0: 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
e000: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
e010: 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
e020: 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
e030: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
e040: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e050: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
e060: 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
e070: 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
e080: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
e090: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
e0a0: 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
e0b0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
e0c0: 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
e0d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
e0e0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
e0f0: 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70  pen(.  Pager **p
e100: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
e110: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
e120: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
e130: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
e140: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e150: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
e160: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
e170: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
e180: 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
e190: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
e1a0: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
e1b0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
e1c0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1e0: 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
e1f0: 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
e200: 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  .){.  Pager *pPa
e210: 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ger = 0;.  char 
e220: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
e230: 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65   0;.  int nameLe
e240: 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20  n;  /* Compiler 
e250: 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69  is wrong. This i
e260: 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
e270: 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 20  ized before use 
e280: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b  */.  OsFile *fd;
e290: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e2a0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
e2b0: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
e2c0: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
e2d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
e2e0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
e2f0: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
e300: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
e310: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
e320: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
e330: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
e340: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
e350: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
e360: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
e370: 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E];.#ifdef SQLIT
e380: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
e390: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
e3a0: 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
e3b0: 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
e3c0: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
e3d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
e3e0: 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
e3f0: 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
e400: 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
e410: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
e420: 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
e430: 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
e440: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
e450: 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
e460: 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
e470: 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
e480: 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
e490: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
e4a0: 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c   be set. It woul
e4b0: 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73  d be nice to ass
e4c0: 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68  ert.  ** that Th
e4d0: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
e4e0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74  is non-zero, but
e4f0: 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b   alas this break
e500: 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20  s test cases .  
e510: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e  ** written to in
e520: 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64  voke the pager d
e530: 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  irectly..  */.  
e540: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
e550: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
e560: 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
e570: 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66  ( pTsd );.#endif
e580: 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63  ..  /* If malloc
e590: 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 66  () has already f
e5a0: 61 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c  ailed return SQL
e5b0: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72  ITE_NOMEM. Befor
e5c0: 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74  e even.  ** test
e5d0: 69 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65  ing for this, se
e5e0: 74 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55  t *ppPager to NU
e5f0: 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72  LL so the caller
e600: 20 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72   knows the pager
e610: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
e620: 77 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61  was never alloca
e630: 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70  ted. .  */.  *pp
e640: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  Pager = 0;.  if(
e650: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
e660: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65  iled() ){.    re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e680: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
e690: 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  &fd, 0, sizeof(f
e6a0: 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  d));..  /* Open 
e6b0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61  the pager file a
e6c0: 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68  nd set zFullPath
e6d0: 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74  name to point at
e6e0: 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a   malloc()ed .  *
e6f0: 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e  * memory contain
e700: 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ing the complete
e710: 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20   filename (i.e. 
e720: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69  including the di
e730: 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20  rectory)..  */. 
e740: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
e750: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
e760: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e770: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e780: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
e790: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
e7a0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
e7b0: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
e7c0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
e7d0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22   sqliteStrDup(""
e7e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
e7f0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
e800: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e810: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
e820: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
e830: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
e840: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e850: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e860: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
e870: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
e880: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
e890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e8b0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
e8c0: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
e8d0: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
e8e0: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
e8f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e900: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e910: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e920: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e930: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e940: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
e950: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
e960: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
e970: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
e980: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
e990: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
e9a0: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e9b0: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
e9c0: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
e9d0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
e9e0: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
e9f0: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
ea00: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
ea10: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
ea20: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
ea30: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
ea40: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
ea50: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
ea60: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
ea70: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ea80: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
ea90: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
eaa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
eab0: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
eac0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
ead0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
eae0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
eaf0: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
eb00: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
eb10: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
eb20: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
eb30: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
eb40: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
eb50: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
eb60: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
eb70: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
eb80: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
eb90: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
eba0: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
ebb0: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
ebc0: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
ebd0: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
ebe0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
ebf0: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
ec00: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
ec10: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
ec20: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
ec30: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
ec40: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
ec50: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
ec60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
ec70: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
ec80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ec90: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
eca0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ecb0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
ecc0: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
ecd0: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
ece0: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52  M:rc);.  }..  TR
ecf0: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
ed00: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
ed10: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
ed20: 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
ed30: 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
ed40: 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
ed50: 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
ed60: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
ed70: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
ed80: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
ed90: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
eda0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
edb0: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
edc0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
edd0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ede0: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
edf0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
ee00: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
ee10: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
ee20: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
ee30: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
ee40: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
ee50: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
ee60: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
ee70: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
ee80: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
ee90: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
eea0: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
eeb0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
eec0: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
eed0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
eee0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
eef0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
ef00: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
ef10: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
ef20: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
ef30: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
ef40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ef50: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
ef60: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
ef70: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
ef80: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
ef90: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
efa0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
efb0: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
efc0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
efd0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
efe0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
eff0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f000: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
f010: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f020: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
f030: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
f040: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
f050: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
f060: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
f070: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f080: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
f090: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f0a0: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
f0b0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f0c0: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
f0d0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
f0e0: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
f0f0: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
f100: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
f110: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
f120: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
f130: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f140: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f150: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
f160: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
f170: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
f180: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
f190: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
f1a0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
f1b0: 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
f1c0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
f1d0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f1e0: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
f1f0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
f200: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
f210: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
f220: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f230: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f240: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
f250: 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
f260: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
f270: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f280: 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
f290: 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
f2a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
f2b0: 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45  rSize = PAGER_SE
f2c0: 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  CTOR_SIZE;.  /* 
f2d0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
f2e0: 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
f2f0: 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
f300: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
f310: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
f320: 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
f330: 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
f340: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f350: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
f360: 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  T.  pPager->pNex
f370: 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  t = pTsd->pPager
f380: 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72  ;.  pTsd->pPager
f390: 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
f3a0: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
f3b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
f3c0: 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
f3d0: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
f3e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
f3f0: 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c  er_set_busyhandl
f400: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
f410: 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
f420: 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
f430: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
f440: 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
f450: 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
f460: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
f470: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
f480: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
f490: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
f4a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
f4b0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
f4c0: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
f4d0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
f4e0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
f4f0: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
f500: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
f510: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
f520: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
f530: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
f540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
f550: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
f560: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
f570: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
f580: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
f590: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
f5a0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
f5b0: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
f5c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f5d0: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
f5e0: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
f5f0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
f600: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
f610: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
f620: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
f630: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
f640: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
f650: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
f660: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
f670: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
f680: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
f690: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f6a0: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
f6b0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
f6c0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
f6d0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
f6e0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
f6f0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
f700: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
f710: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
f720: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
f730: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
f740: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
f750: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
f760: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
f770: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
f780: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
f790: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
f7a0: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
f7b0: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
f7c0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
f7d0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
f7e0: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
f7f0: 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
f800: 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
f810: 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
f820: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
f830: 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
f840: 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
f850: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
f860: 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
f870: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
f880: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f890: 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  _pagesize(Pager 
f8a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
f8b0: 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
f8c0: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
f8d0: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
f8e0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f8f0: 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
f900: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
f910: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f920: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
f930: 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63    sqlite3Realloc
f940: 4f 72 46 72 65 65 28 28 76 6f 69 64 20 2a 2a 29  OrFree((void **)
f950: 26 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  &pPager->pTmpSpa
f960: 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  ce, pageSize);. 
f970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
f980: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  er->pageSize;.}.
f990: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f9a0: 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
f9b0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f9c0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
f9d0: 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
f9e0: 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
f9f0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
fa00: 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
fa10: 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
fa20: 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
fa30: 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
fa40: 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
fa50: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
fa60: 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
fa70: 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
fa80: 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
fa90: 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
faa0: 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
fab0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
fac0: 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
fad0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
fae0: 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
faf0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
fb00: 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
fb10: 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
fb20: 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75  .void clear_simu
fb30: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
fb40: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
fb50: 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a  rror_hit = 0;.}.
fb60: 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
fb70: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
fb80: 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
fb90: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
fba0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
fbb0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
fbc0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
fbd0: 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
fbe0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fbf0: 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
fc00: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
fc10: 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
fc20: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
fc30: 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  ne clear_simulat
fc40: 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20  ed_io_error().# 
fc50: 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
fc60: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fc70: 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
fc80: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
fc90: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
fca0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
fcb0: 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
fcc0: 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
fcd0: 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
fce0: 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
fcf0: 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
fd00: 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
fd10: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
fd20: 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
fd30: 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
fd40: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
fd50: 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
fd60: 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
fd70: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
fd80: 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
fd90: 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
fda0: 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
fdb0: 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
fdc0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
fdd0: 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
fde0: 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
fdf0: 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
fe00: 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
fe10: 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
fe20: 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
fe30: 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
fe40: 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
fe50: 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
fe60: 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
fe70: 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
fe80: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
fe90: 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72  _read_fileheader
fea0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
feb0: 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
fec0: 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
fed0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fee0: 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
fef0: 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28  st, 0, N);.  if(
ff00: 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20   MEMDB==0 ){.   
ff10: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
ff20: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
ff30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
ff40: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  k(pPager->fd, 0)
ff50: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
ff60: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ff70: 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ();.    IOTRACE(
ff80: 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
ff90: 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
ffa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ffb0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
ffc0: 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20  d, pDest, N);.  
ffd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ffe0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
fff0: 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
10000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
10010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10030 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
10040 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
10050 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
10060 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
10070 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
10080 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
10090 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
100a0 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
100b0 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
100c0 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
100d0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
100e0 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
100f0 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
10100 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
10110 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
10120 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
10130 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
10140 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
10150 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
10160 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
10170 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
10180 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
10190 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
101a0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
101b0 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
101c0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
101d0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
101e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
101f0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
10200 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
10210 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
10220 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69    if( (rc = sqli
10230 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10240 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
10250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10260 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
10270 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
10280 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10290 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
102a0 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
102b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
102c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
102d0 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
102e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
102f0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
10300 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
10310 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
10320 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
10330 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
10340 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
10350 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
10360 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
10370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
10380 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
10390 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
103a0 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
103b0 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
103c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
103d0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
103e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
103f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
10400 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
10410 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10420 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d  pStmt);.  pHist-
10430 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48  >pOrig = 0;.  pH
10440 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
10450 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10460 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a  clearHistory(x).
10470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
10480 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
10490 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
104a0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
104b0 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  r*);../*.** Unli
104c0 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
104d0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
104e0 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
104f0 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
10500 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
10510 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
10520 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
10530 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
10540 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
10550 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
10560 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72  ger_movepage() r
10570 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
10580 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
10590 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
105a0 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
105b0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
105c0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
105d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
105e0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
105f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10600 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
10610 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
10620 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10630 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
10640 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
10650 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
10660 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
10670 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
10680 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
10690 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
106a0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
106b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
106c0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
106d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
106e0 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
106f0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
10700 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
10710 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
10720 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
10730 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10740 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
10750 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
10760 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
10770 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
10780 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
10790 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
107a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
107b0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
107c0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
107d0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
107e0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
107f0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
10800 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
10810 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
10820 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
10830 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
10840 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
10850 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
10860 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
10870 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
10880 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
10890 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
108a0 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
108b0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
108c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
108d0 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65  ;..  /* Keep the
108e0 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f   pFirstSynced po
108f0 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61  inter pointing a
10900 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63  t the first sync
10910 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f  hronized page */
10920 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67  .  if( pPg==pPag
10930 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
10940 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
10950 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10960 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  e;.    while( p 
10970 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
10980 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
10990 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72  ee; }.    pPager
109a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
109b0 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   p;.  }..  /* Un
109c0 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72  link from the fr
109d0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20  eelist */.  if( 
109e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
109f0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
10a00 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
10a10 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10a20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
10a40 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  First==pPg );.  
10a50 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10a60 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10a70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  e;.  }.  if( pPg
10a80 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
10a90 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
10aa0 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
10ab0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
10ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
10ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  rt( pPager->pLas
10ae0 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
10af0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
10b00 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
10b10 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  }.  pPg->pNextFr
10b20 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
10b30 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55  ree = 0;..  /* U
10b40 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
10b50 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
10b60 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
10b70 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
10b80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10b90 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10ba0 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  B./*.** This rou
10bb0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
10bc0 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
10bd0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
10be0 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70   Delete.** all p
10bf0 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
10c00 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
10c10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
10c20 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
10c30 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  d..** Referenced
10c40 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
10c50 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
10c60 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f  e are zeroed..*/
10c70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
10c80 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65  oryTruncate(Page
10c90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
10ca0 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
10cb0 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
10cc0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
10cd0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
10ce0 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
10cf0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
10d00 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
10d10 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
10d20 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
10d30 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
10d40 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
10d50 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
10d60 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
10d70 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
10d80 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
10d90 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
10da0 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
10db0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
10dc0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
10dd0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
10de0 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
10df0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
10e00 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
10e10 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
10e20 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
10e30 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
10e40 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
10e50 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75  define memoryTru
10e60 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a  ncate(p).#endif.
10e70 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
10e80 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
10e90 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
10ea0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
10eb0 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
10ec0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
10ed0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
10ee0 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75  eat until the bu
10ef0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
10f00 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
10f10 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
10f20 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
10f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10f40 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
10f50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
10f60 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
10f70 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
10f80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10f90 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
10fa0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10fb0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
10fc0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
10fd0 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
10fe0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
10ff0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
11000 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
11010 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
11020 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
11030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
11040 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
11050 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
11060 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
11070 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
11080 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
11090 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
110a0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
110b0 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
110c0 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
110d0 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
110e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
110f0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
11100 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c  ager->dbSize<0 |
11110 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66  | MEMDB );..  if
11120 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11130 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
11140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
11160 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
11170 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
11180 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
11190 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
111a0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
111b0 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
111c0 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
111d0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
111e0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
111f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11200 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11210 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
11220 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
11230 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
11240 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
11250 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11260 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11270 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
11280 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
11290 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
112a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
112b0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
112c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
112d0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
112e0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
112f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11300 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
11310 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
11320 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
11330 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
11340 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11350 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
11360 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
11370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11380 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
11390 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
113a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
113b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
113c0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
113d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
113e0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
113f0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
11400 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
11410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11420 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a    }.  rc = syncJ
11430 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
11440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11450 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11460 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
11470 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
11480 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
11490 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
114a0 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  ncating. */.  rc
114b0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
114c0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
114d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
114e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
114f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
11500 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
11510 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11520 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
11530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11540 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
11550 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11560 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
11570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
11580 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
11590 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
115a0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
115b0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
115c0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
115d0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
115e0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
115f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11600 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
11610 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
11620 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
11630 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
11640 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
11650 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
11660 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
11670 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
11680 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
11690 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
116a0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
116b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
116c0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
116d0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
116e0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
116f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
11700 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
11710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11720 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
11730 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
11740 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
11750 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11760 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
11770 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
11780 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
11790 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
117a0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
117b0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
117c0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
117d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
117e0 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72  ager_close(Pager
117f0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
11800 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11810 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
11820 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
11830 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
11840 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
11850 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
11860 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
11870 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
11880 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
11890 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
118a0 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
118b0 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
118c0 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
118d0 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
118e0 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
118f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
11900 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
11910 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
11920 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a  loc can be set..
11930 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
11940 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
11950 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
11960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20   assert( pPager 
11970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
11980 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f  d && pTsd->nAllo
11990 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  c );.#endif..  d
119a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
119b0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
119c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
119d0 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
119e0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  et(pPager);.  en
119f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
11a00 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 54 52  o_errors();.  TR
11a10 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
11a20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
11a30 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  r));.  IOTRACE((
11a40 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
11a50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74 28  ager)).  assert(
11a60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11a70 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
11a80 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70  rnalOpen==0 && p
11a90 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d  Pager->stmtOpen=
11aa0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  =0) );.  if( pPa
11ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
11ad0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
11ae0 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
11af0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
11b00 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  InJournal);.  if
11b10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
11b20 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
11b30 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
11b40 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
11b50 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
11b60 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
11b70 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
11b80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
11b90 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
11ba0 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
11bb0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
11bc0 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
11bd0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
11be0 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
11bf0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
11c00 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
11c10 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
11c20 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
11c30 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65  r from the linke
11c40 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
11c50 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20   starting at .  
11c60 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50  ** ThreadData.pP
11c70 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  ager if memory-m
11c80 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
11c90 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bled..  */.  if(
11ca0 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70   pPager==pTsd->p
11cb0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73  Pager ){.    pTs
11cc0 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
11cd0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  er->pNext;.  }el
11ce0 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70  se{.    Pager *p
11cf0 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d  Tmp;.    for(pTm
11d00 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  p = pTsd->pPager
11d10 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70  ; pTmp->pNext!=p
11d20 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70  Pager; pTmp=pTmp
11d30 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70  ->pNext){}.    p
11d40 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  Tmp->pNext = pPa
11d50 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
11d60 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46  #endif.  sqliteF
11d70 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
11d80 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  h);.  sqliteFree
11d90 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
11da0 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ce);.  sqliteFre
11db0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
11dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11de0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
11df0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
11e00 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
11e10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
11e20 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
11e30 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11e40 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11e50 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
11e60 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
11e70 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
11e80 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
11e90 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
11ea0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
11eb0 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
11ec0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11ed0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11ee0 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
11ef0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
11f00 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
11f10 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
11f20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
11f30 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
11f40 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
11f50 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
11f60 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
11f70 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
11f80 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11f90 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
11fa0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
11fb0 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
11fc0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
11fd0 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
11fe0 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
11ff0 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
12000 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
12010 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
12020 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
12030 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
12040 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
12050 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
12060 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
12070 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
12080 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12090 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
120a0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
120b0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
120c0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
120d0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
120e0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
120f0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
12100 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12110 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
12120 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
12130 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
12140 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
12150 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
12160 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
12170 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12180 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
12190 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
121a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
121b0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
121c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
121d0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
121e0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
121f0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
12200 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12210 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
12220 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
12230 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12240 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
12250 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
12260 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
12270 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12280 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
12290 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
122a0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
122b0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
122c0 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
122d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
122e0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
122f0 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
12300 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
12310 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
12320 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
12330 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
12340 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
12350 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
12360 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
12370 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12380 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
12390 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
123a0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
123b0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
123c0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
123d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
123e0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
123f0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
12400 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
12410 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
12420 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12430 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12440 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12450 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
12460 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
12470 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
12480 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12490 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
124a0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
124b0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
124c0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
124d0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
124e0 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
124f0 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12500 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12510 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12520 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12530 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
12540 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12550 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
12560 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
12570 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
12580 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12590 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
125a0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
125b0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
125c0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
125d0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
125e0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
125f0 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12600 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12610 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12620 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12630 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12640 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12650 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12660 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12670 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
12680 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12690 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
126a0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
126b0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
126c0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
126d0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
126e0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
126f0 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12700 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12710 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12720 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12730 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12740 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12750 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12760 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12770 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
12780 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12790 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
127a0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
127b0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
127c0 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
127d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
127e0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
127f0 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12800 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12810 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12820 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12830 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12840 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12850 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12870 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
12880 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
12890 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
128a0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
128b0 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
128c0 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
128d0 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
128e0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
128f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12900 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
12910 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12920 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
12930 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12940 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12950 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
12960 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
12970 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
12980 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
12990 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
129a0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
129b0 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
129c0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
129d0 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
129e0 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
129f0 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
12a00 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
12a10 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
12a20 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
12a30 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
12a40 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
12a50 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
12a60 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
12a70 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12a80 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
12a90 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
12aa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12ab0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12ac0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
12ad0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
12ae0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
12af0 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
12b00 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12b10 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
12b20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12b30 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12b40 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
12b50 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
12b60 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
12b70 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
12b80 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
12b90 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
12ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
12bb0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
12bc0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
12bd0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
12be0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
12bf0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
12c00 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
12c10 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
12c20 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12c30 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
12c40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12c50 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
12c60 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
12c70 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
12c80 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
12c90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
12ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
12cb0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
12cc0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
12cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12ce0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
12cf0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
12d00 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
12d30 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
12d40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12d70 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
12d80 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
12d90 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c));.        if(
12da0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12db0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
12dc0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
12dd0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20  %d\n", pPager,. 
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12e00 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
12e10 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29  urnalMagic), 4))
12e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
12e30 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
12e40 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
12e50 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
12e60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12e70 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
12e80 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12e90 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
12ea0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
12eb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
12ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12ed0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
12ee0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
12ef0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
12f00 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
12f10 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
12f20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %d\n", pPager))
12f30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12f40 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
12f50 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
12f60 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
12f70 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
12f90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12fa0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
12fb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
12fc0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
12fd0 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
12fe0 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
12ff0 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
13000 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
13010 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
13020 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
13030 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
13040 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
13050 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
13060 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
13070 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
13080 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
13090 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
130a0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
130b0 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
130c0 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
130d0 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
130e0 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
130f0 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
13100 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
13110 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
13120 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
13130 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
13140 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
13150 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
13160 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
13170 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
13180 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
13190 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
131a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
131b0 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
131c0 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
131d0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
131e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
131f0 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
13200 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
13210 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
13220 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
13230 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
13240 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
13250 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
13260 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
13270 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
13280 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
13290 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
132a0 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
132b0 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
132c0 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
132d0 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
132e0 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
132f0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13300 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
13310 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
13320 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
13330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13340 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13350 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
13360 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
13370 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
13380 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
13390 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
133a0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
133b0 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
133c0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
133d0 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
133e0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
133f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
13400 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
13410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
13420 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
13430 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
13440 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
13450 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
13460 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
13470 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
13480 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
13490 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
134a0 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
134b0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
134c0 52 54 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61  RT_BUCKET 25.sta
134d0 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f  tic PgHdr *sort_
134e0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
134f0 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61  pIn){.  PgHdr *a
13500 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c  [N_SORT_BUCKET],
13510 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
13520 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
13530 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65  eof(a));.  while
13540 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d  ( pIn ){.    p =
13550 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20   pIn;.    pIn = 
13560 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
13570 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
13590 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b  ORT_BUCKET-1; i+
135a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  +){.      if( a[
135b0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
135c0 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20   a[i] = p;.     
135d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
135e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
135f0 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13600 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
13610 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20      a[i] = 0;.  
13620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13630 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55  if( i==N_SORT_BU
13640 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20  CKET-1 ){.      
13650 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
13660 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
13670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
13680 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
13690 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
136a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
136b0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
136c0 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
136d0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
136e0 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
136f0 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
13700 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
13710 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
13720 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
13730 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
13740 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
13750 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
13760 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
13770 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
13780 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
13790 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
137a0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
137b0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
137c0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
137d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
137e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
137f0 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
13800 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
13810 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
13820 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
13830 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
13840 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
13850 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
13860 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
13870 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
13880 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
13890 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
138a0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
138b0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
138c0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
138d0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
138e0 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
138f0 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
13900 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
13910 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
13920 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13930 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
13940 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
13950 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
13960 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
13970 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
13980 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
13990 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
139a0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
139b0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
139c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
139d0 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
139e0 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
139f0 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
13a00 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
13a10 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
13a20 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
13a30 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
13a40 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
13a50 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
13a60 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13a70 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
13a80 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
13a90 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
13aa0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
13ab0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
13ac0 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
13ad0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
13ae0 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
13af0 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
13b00 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
13b10 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
13b20 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
13b30 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
13b40 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
13b50 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
13b60 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
13b70 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
13b80 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
13b90 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
13ba0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
13bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
13bd0 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
13be0 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
13bf0 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
13c00 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
13c10 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
13c20 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
13c30 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13c40 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
13c50 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
13c60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13c70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13c80 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
13c90 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
13ca0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
13cb0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
13cc0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
13cd0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
13ce0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
13cf0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
13d00 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
13d10 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
13d20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
13d30 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
13d40 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
13d50 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
13d60 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
13d70 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
13d80 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
13d90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
13da0 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
13db0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
13dc0 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
13dd0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50  CODEC2(pPager, P
13de0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
13df0 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
13e00 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43  , 6);.      TRAC
13e10 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E3("STORE %d pag
13e20 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
13e30 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
13e40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f  >pgno);.      IO
13e50 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
13e60 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
13e70 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20  pList->pgno)).  
13e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
13ea0 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
13eb0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13ec0 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
13ed0 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
13ee0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
13ef0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
13f00 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54      TRACE3("NOST
13f10 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
13f20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
13f30 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
13f40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13f50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13f60 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74  rn rc;.    pList
13f70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  ->dirty = 0;.#if
13f80 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
13f90 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74  _PAGES.    pList
13fa0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
13fb0 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
13fc0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  t);.#endif.    p
13fd0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
13fe0 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  irty;.  }.  retu
13ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14000 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65  ./*.** Collect e
14010 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20  very dirty page 
14020 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73  into a dirty lis
14030 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
14040 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14050 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69   head of that li
14060 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61  st.  All pages a
14070 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20  re.** collected 
14080 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65  even if they are
14090 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a   still in use..*
140a0 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
140b0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
140c0 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20  rty_pages(Pager 
140d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
140e0 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  rn pPager->pDirt
140f0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
14100 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65  rn TRUE if there
14110 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
14120 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
14130 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
14140 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
14150 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
14160 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
14170 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
14180 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
14190 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
141a0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
141b0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
141c0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
141d0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
141e0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
141f0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
14200 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
14210 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
14220 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
14230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
14240 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
14250 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
14260 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
14270 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  rnal ) return 0;
14280 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f  .  if( !sqlite3O
14290 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
142a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20  er->zJournal) ) 
142b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
142c0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
142d0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
142e0 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20  r->fd) ) return 
142f0 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
14300 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
14310 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20  pPager)==0 ){.  
14320 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
14330 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
14340 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  al);.    return 
14350 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14360 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
14370 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
14380 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
14390 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20   cache that can 
143a0 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a  be recycled. .**
143b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
143c0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
143d0 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
143e0 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f  _FULL or SQLITE_
143f0 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20  OK. It .** does 
14400 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67  not set the pPag
14410 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69  er->errCode vari
14420 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
14430 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c  int pager_recycl
14440 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14450 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48   int syncOk, PgH
14460 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
14470 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
14480 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e  g = 0;..  /* Fin
14490 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
144a0 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
144b0 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
144c0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
144d0 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
144e0 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
144f0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
14500 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
14510 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
14520 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
14530 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
14540 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
14550 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
14560 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
14570 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
14580 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
14590 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
145a0 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
145b0 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
145c0 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
145d0 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
145e0 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
145f0 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
14600 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
14610 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
14620 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26  rst && syncOk &&
14630 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e   !MEMDB){.    in
14640 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
14650 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
14660 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
14670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14680 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14690 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
146a0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
146b0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
146c0 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
146d0 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
146e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  he.      ** jour
146f0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
14700 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
14710 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
14720 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14730 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
14740 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
14750 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
14760 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
14770 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
14780 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
14790 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
147a0 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
147b0 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68  s.      ** trash
147c0 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
147d0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
147e0 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d)..      */.   
147f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
14800 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
14810 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14820 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
14830 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
14840 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
14850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
14860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
14870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14880 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70     }.    pPg = p
14890 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
148a0 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
148b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
148c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
148d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
148e0 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  f==0 );..  /* Wr
148f0 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
14900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14910 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
14920 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
14930 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69  ->dirty ){.    i
14940 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
14950 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
14960 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43  ==0 );.    makeC
14970 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
14980 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
14990 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
149a0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
149b0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
149c0 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66  t( pPg );.    if
149d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
149e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
149f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
14a00 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
14a10 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
14a20 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
14a30 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
14a40 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
14a50 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
14a60 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
14a70 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
14a80 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
14a90 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
14aa0 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
14ab0 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
14ac0 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
14ad0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
14ae0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
14af0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
14b00 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
14b10 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
14b20 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
14b30 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
14b40 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
14b50 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
14b60 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
14b70 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
14b80 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
14b90 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
14ba0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
14bb0 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
14bc0 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
14bd0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
14be0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
14bf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
14c00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
14c10 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
14c20 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
14c30 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
14c40 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
14c50 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
14c60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
14c70 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
14c80 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
14c90 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
14ca0 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
14cb0 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
14cc0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
14cd0 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70  ->nOvfl);..  *pp
14ce0 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
14cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14d00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14d10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
14d20 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
14d30 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
14d40 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
14d50 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
14d60 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
14d70 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
14d80 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
14d90 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
14da0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14db0 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46  d may be sqliteF
14dc0 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
14dd0 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
14de0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
14df0 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
14e00 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
14e10 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
14e20 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
14e30 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61   returns. A nega
14e40 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e  tive value for n
14e50 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65  Req means.** fre
14e60 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
14e70 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   as possible. Th
14e80 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
14e90 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
14ea0 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
14eb0 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
14ec0 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
14ee0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e  RY_MANAGEMENT.in
14ef0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
14f00 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e  elease_memory(in
14f10 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74  t nReq){.  const
14f20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
14f30 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
14f40 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
14f50 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20  );.  Pager *p;. 
14f60 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
14f70 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
14f80 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
14f90 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
14fa0 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
14fb0 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
14fc0 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
14fd0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
14fe0 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
14ff0 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
15000 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
15010 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
15020 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
15030 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
15040 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
15050 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
15060 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
15070 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
15080 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
15090 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
150a0 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
150b0 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
150c0 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
150d0 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
150e0 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
150f0 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
15100 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
15110 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
15120 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
15130 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
15140 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
15150 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
15160 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
15170 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
15180 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
15190 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
151a0 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
151b0 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
151c0 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
151d0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
151e0 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
151f0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
15200 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
15210 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
15220 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
15230 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
15240 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70   for(p=pTsdro->p
15250 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65  Pager; p && (nRe
15260 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
15270 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65  <nReq); p=p->pNe
15280 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
15290 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
152a0 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   rc;..      /* F
152b0 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
152c0 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
152d0 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
152e0 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
152f0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
15300 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
15310 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
15320 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
15330 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
15340 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
15350 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
15360 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
15370 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c  pager_recycle(p,
15380 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
15390 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
153a0 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
153b0 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
153c0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
153d0 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
153e0 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
153f0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
15400 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
15410 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
15420 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
15430 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
15440 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
15450 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
15460 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
15470 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
15480 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
15490 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
154a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
154b0 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
154c0 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
154d0 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
154e0 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
154f0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
15500 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
15510 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
15520 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
15530 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15540 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
15550 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
15560 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
15570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
15580 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  g==p->pAll ){.  
15590 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c           p->pAll
155a0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
155b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
155c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
155d0 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54  pTmp=p->pAll; pT
155e0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
155f0 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
15600 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
15610 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
15620 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
15630 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
15640 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
15650 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
15660 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
15670 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
15680 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
156a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
156b0 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
156c0 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
156d0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
156e0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
156f0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
15700 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
15710 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
15720 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
15730 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
15740 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
15750 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
15760 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
15770 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
15780 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
15790 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
157a0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
157b0 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
157c0 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
157d0 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
157e0 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
157f0 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
15800 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
15810 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
15820 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
15830 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  rt( (rc&0xff)==S
15840 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
15850 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
15860 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15870 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
15880 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
15890 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
158a0 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  r(p, rc);.      
158b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
158c0 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b  eturn nReleased;
158d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
158e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
158f0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a  Y_MANAGEMENT */.
15900 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15910 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
15920 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
15930 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
15940 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
15950 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
15960 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
15970 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
15980 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
15990 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
159a0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
159b0 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
159c0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
159d0 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
159e0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
159f0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
15a00 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
15a10 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
15a20 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
15a30 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
15a40 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
15a50 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
15a60 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
15a70 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
15a80 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
15a90 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
15aa0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
15ab0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
15ac0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
15ad0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
15ae0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
15af0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
15b00 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
15b10 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
15b20 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
15b30 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
15b40 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
15b50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
15b60 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
15b70 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
15b80 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
15b90 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20  ager_lookup().  
15ba0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
15bb0 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20  e and _lookup() 
15bc0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
15bd0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
15be0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
15bf0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
15c00 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
15c10 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
15c20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
15c30 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
15c40 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
15c50 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  s _lookup().** j
15c60 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
15c70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
15c80 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
15c90 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
15ca0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
15cb0 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
15cc0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
15cd0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
15ce0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
15cf0 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28  * Since _lookup(
15d00 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
15d10 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
15d20 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
15d30 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
15d40 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
15d50 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66   If clrFlag is f
15d60 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
15d70 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
15d80 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
15d90 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c  isk..** If clfFl
15da0 61 67 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  ag is true, it m
15db0 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
15dc0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61   about to be era
15dd0 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69  sed and.** rewri
15de0 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72  tten without fir
15df0 73 74 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f  st being read so
15e00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
15e10 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74  nt it doing.** t
15e20 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a  he disk I/O..*/.
15e30 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
15e40 5f 61 63 71 75 69 72 65 28 50 61 67 65 72 20 2a  _acquire(Pager *
15e50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
15e60 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
15e70 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a  , int clrFlag){.
15e80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
15e90 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
15ea0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
15eb0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
15ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15ed0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
15ee0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
15ef0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
15f00 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
15f10 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
15f20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
15f30 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
15f40 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15f50 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15f60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15f70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
15f80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
15f90 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
15fa0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
15fb0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
15fc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15fd0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
15fe0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
15ff0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
16000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
16010 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
16020 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
16030 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
16040 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16050 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
16060 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
16070 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
16080 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
16090 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
160a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
160b0 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
160c0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
160d0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
160e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
160f0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
16100 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
16110 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
16120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16130 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16140 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16150 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
16160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
16170 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
16180 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
16190 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
161a0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
161b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
161c0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
161d0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
161e0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
161f0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
16200 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
16210 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
16220 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
16230 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16240 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16250 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
16260 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
16270 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
16280 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
16290 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
162a0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
162b0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58  the.       ** EX
162c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
162d0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
162e0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
162f0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
16300 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16310 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
16320 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
16330 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
16340 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
16350 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
16360 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
16370 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16380 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
16390 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
163a0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a      ** .       *
163b0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
163c0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
163d0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
163e0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
163f0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
16400 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
16410 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
16420 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
16430 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a  ail to.       **
16440 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16450 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16460 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16470 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  file..       */.
16480 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16490 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
164a0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
164b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
164c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
164d0 29 7b 0a 20 20 20 20 20 20 20 20 20 70 61 67 65  ){.         page
164e0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
164f0 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
16500 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
16510 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16520 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
16530 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16540 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
16550 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
16560 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
16570 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
16580 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
16590 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
165a0 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
165b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
165c0 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
165d0 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
165e0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
165f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
16600 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
16610 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
16620 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
16630 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
16640 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
16650 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
16660 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
16670 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
16680 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
16690 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
166a0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
166b0 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
166c0 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
166d0 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
166e0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
166f0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
16700 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
16710 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
16720 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
16730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16740 0a 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  .         pager_
16750 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
16760 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16770 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
16790 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
167a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61   = 1;.       pPa
167b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
167c0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
167d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
167e0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ff = 0;.       p
167f0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
16800 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
16810 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
16820 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 0;..       /* 
16830 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
16840 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
16850 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
16860 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
16870 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
16880 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
16890 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
168a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
168b0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
168c0 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  r);.       if( r
168d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
168e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
168f0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16900 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
16910 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
16920 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
16930 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
16940 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
16950 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16960 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16970 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d  pgno);.    if( M
16980 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
16990 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
169a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
169b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
169c0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
169d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
169e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
169f0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
16a00 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
16a10 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
16a20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f  int h;.    TEST_
16a30 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
16a40 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ss);.    if( pPa
16a50 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
16a60 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
16a70 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
16a80 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  | MEMDB ){.     
16a90 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
16aa0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
16ab0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
16ac0 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
16ad0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
16ae0 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
16af0 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20  le(pPager,.     
16b00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
16b10 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
16b20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
16b30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
16b40 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
16b50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16b80 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73   }.      pPg = s
16b90 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
16ba0 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
16bb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
16be0 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
16bf0 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
16c20 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
16c30 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ory) );.      if
16c40 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
16c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16c60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
16c70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
16c80 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
16c90 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
16ca0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
16cb0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16cc0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
16cd0 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
16ce0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
16cf0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
16d00 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
16d10 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
16d20 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
16d30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
16d40 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
16d50 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
16d60 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  +;.      if( pPa
16d70 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
16d80 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
16d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16da0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d  Pager->nMaxPage=
16db0 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d  =(pPager->nPage-
16dc0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  1) );.        pP
16dd0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b  ager->nMaxPage++
16de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16df0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16e00 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
16e10 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
16e20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16e30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16e40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16e50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16e60 72 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a  rt(pPg) ;.    }.
16e70 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
16e80 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
16e90 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16ea0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16eb0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16ec0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
16ed0 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
16ee0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16ef0 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
16f00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16f10 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16f20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16f30 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
16f40 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
16f50 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16f60 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
16f70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
16f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16f90 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16fa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
16fb0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
16fc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16fd0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
16fe0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
16ff0 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
17000 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
17010 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
17020 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
17030 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
17040 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
17050 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
17060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17070 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
17080 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
17090 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c      }.    makeCl
170a0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
170b0 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
170c0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
170d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
170e0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
170f0 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
17100 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
17110 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
17120 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
17130 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
17140 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
17150 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
17160 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
17170 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
17180 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
17190 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
171a0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
171b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
171c0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
171d0 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64   the page with d
171e0 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72  ata, either by r
171f0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
17200 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
17210 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74  file, or by sett
17220 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
17230 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  age to zero..   
17240 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
17250 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
17260 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29  nt(pPager)<(int)
17270 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 0a 20 20  pgno || MEMDB.  
17280 20 20 20 20 20 20 20 7c 7c 20 28 63 6c 72 46 6c         || (clrFl
17290 61 67 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  ag && !pPager->a
172a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 0a  lwaysRollback) .
172b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d      ){.      mem
172c0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
172d0 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
172e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
172f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17300 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
17310 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
17320 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
17330 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
17340 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
17350 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
17360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17370 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17380 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
17390 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
173a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
173d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
173e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
173f0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
17400 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
17410 67 6e 6f 29 29 0a 20 20 20 20 20 20 54 52 41 43  gno)).      TRAC
17420 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
17430 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17440 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17450 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
17460 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
17470 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
17480 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
17490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
174a0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
174b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
174c0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
174d0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
174e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
174f0 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
17500 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
17510 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17530 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
17540 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
17550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17560 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
17570 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
17580 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
17590 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
175a0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
175b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
175c0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
175d0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
175e0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
175f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
17600 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
17610 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
17620 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
17630 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
17640 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
17650 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
17660 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
17670 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
17680 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17690 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
176a0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
176b0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
176c0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
176d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
176e0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
176f0 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
17700 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53  ache. */.    TES
17710 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
17720 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
17730 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
17740 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
17750 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
17760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
17780 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
17790 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
177a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
177b0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
177c0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
177d0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
177e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
177f0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
17800 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17810 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
17820 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
17830 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
17840 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
17850 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
17860 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
17870 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
17880 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
17890 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
178a0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
178b0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
178c0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
178d0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
178e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
178f0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
17900 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
17910 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
17920 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
17930 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
17940 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
17950 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
17960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17970 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
17980 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
17990 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
179a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
179b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
179c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
179d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
179e0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
179f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17a00 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
17a10 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
17a20 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
17a30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17a40 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
17a50 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
17a60 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
17a70 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
17a80 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
17a90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
17aa0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
17ab0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
17ac0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
17ad0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
17ae0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
17af0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
17b00 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
17b10 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
17b20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
17b30 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
17b40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
17b50 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
17b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
17b70 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
17b80 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
17b90 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
17ba0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
17bb0 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
17bc0 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
17bd0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
17be0 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
17bf0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
17c00 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
17c10 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
17c20 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
17c30 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
17c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
17c50 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
17c60 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
17c70 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
17c80 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
17c90 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
17ca0 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
17cb0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
17cc0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
17cd0 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
17ce0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
17cf0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
17d00 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
17d10 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
17d20 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
17d30 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
17d40 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
17d50 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
17d60 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
17d70 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
17d80 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
17d90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
17da0 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
17db0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
17dc0 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
17dd0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17de0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
17df0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17e00 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
17e10 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17e20 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
17e30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
17e40 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
17e50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17e60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
17e70 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
17e80 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
17e90 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
17ea0 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
17eb0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17ec0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
17ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17ee0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
17ef0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
17f00 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17f10 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
17f20 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61  EMDB ){.      pa
17f30 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17f70 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
17f80 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
17f90 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
17fa0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
17fb0 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
17fc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17fd0 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
17fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17ff0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
18000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
18010 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
18020 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
18030 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
18040 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
18050 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18060 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
18070 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
18080 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
18090 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
180a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
180b0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
180c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
180d0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
180e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
180f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18100 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18110 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18120 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
18130 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18140 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
18150 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
18160 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
18170 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18180 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
18190 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
181a0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
181b0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
181c0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
181d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
181e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
181f0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
18200 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
18210 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
18220 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
18230 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
18240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
18270 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
18280 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
18290 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
182a0 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
182b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
182c0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
182d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
182e0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
182f0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
18300 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
18310 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
18320 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
18330 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
18340 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
18350 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
18360 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
18370 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
18380 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
18390 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44  >jfd, pPager->zD
183a0 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61  irectory);.  pPa
183b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
183c0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
183d0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
183e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
183f0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
18400 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
18410 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
18420 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
18430 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18440 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
18450 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
18460 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
18470 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
18480 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
18490 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
184a0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
184b0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
184c0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
184d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
184e0 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
184f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18510 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
18520 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
18530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18540 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
18550 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
18560 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
18570 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
18580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
185a0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
185b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
185c0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
185d0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
185e0 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
185f0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
18600 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18610 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  al = 0;.  if( rc
18620 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18630 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18640 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20   was a malloc() 
18650 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65  failure, then we
18660 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f   will not be clo
18670 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20  sing the pager. 
18680 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64     ** file. So d
18690 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61  elete any journa
186a0 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61  l file we may ha
186b0 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e  ve just created.
186c0 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
186d0 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77 69  ** the system wi
186e0 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c  ll get confused,
186f0 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64 2d   we have a read-
18700 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
18710 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79   and a.    ** my
18720 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  sterious journal
18730 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e   has appeared in
18740 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
18750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
18760 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
18770 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
18780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65   }else{.    page
18790 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
187a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
187b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
187c0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
187d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
187e0 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
187f0 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
18800 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
18810 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
18820 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
18830 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
18840 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
18850 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
18860 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  rollback() is ca
18870 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
18880 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
18890 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
188a0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
188b0 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61  er_unref() is ca
188c0 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
188d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
188e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
188f0 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
18900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18910 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
18920 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
18930 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
18940 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
18950 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
18960 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
18970 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
18980 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
18990 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
189a0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
189b0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
189c0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
189d0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
189e0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
189f0 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
18a00 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
18a10 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
18a20 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
18a30 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
18a40 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
18a50 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
18a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
18a70 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
18a80 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
18a90 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
18aa0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
18ab0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
18ac0 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
18ad0 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
18ae0 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
18af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18b00 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
18b10 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
18b20 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
18b30 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
18b40 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
18b50 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
18b60 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
18b70 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
18b80 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
18b90 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
18ba0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
18bb0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
18bc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
18bd0 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
18be0 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
18bf0 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
18c00 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
18c10 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
18c20 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
18c30 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
18c40 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
18c50 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
18c60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18c70 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
18c80 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  a, int exFlag){.
18c90 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
18ca0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
18cb0 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
18cc0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18cd0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
18ce0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
18cf0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
18d00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18d10 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18d20 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
18d30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18d40 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
18d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18d60 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
18d70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
18d80 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
18d90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18da0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
18db0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
18dc0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
18dd0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
18de0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
18df0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18e00 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
18e10 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
18e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18e30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
18e40 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
18e50 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
18e60 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
18e70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
18e80 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
18e90 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
18ea0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
18eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18ec0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18ef0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
18f00 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
18f10 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  0;.      TRACE2(
18f20 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
18f30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18f40 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
18f50 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
18f60 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
18f70 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
18f80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
18f90 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
18fa0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18fb0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
18fd0 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
18fe0 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
18ff0 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
19000 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
19010 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
19020 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
19030 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
19040 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
19050 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
19060 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19070 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
19080 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
19090 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
190a0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
190b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
190c0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
190d0 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
190e0 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
190f0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
19100 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
19110 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
19120 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
19130 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
19140 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
19150 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
19160 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
19170 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
19180 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
19190 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
191a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
191b0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
191c0 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
191d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
191e0 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
191f0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
19200 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
19210 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
19220 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
19230 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
19240 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
19250 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
19260 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
19270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
19280 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
19290 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
192a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
192b0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
192c0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
192d0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
192e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
192f0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
19300 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
19310 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
19320 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
19330 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
19340 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
19350 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
19360 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
19370 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19380 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
19390 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
193a0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
193b0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
193c0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
193d0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
193e0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
193f0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
19400 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
19410 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
19420 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
19430 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
19440 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
19450 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
19460 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
19470 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
19480 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
19490 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
194a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
194b0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
194c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
194d0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
194e0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
194f0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
19500 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
19510 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
19520 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
19530 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
19540 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
19550 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
19560 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
19570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
19580 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
19590 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
195a0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
195b0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
195c0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
195d0 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69  o.** reset..*/.i
195e0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
195f0 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
19600 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
19610 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19620 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
19630 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
19640 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
19650 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19660 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
19670 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
19680 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
19690 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
196a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
196b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
196c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
196d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
196e0 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
196f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
19700 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
19710 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
19720 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
19730 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
19740 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
19750 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
19760 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
19770 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
19780 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
19790 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
197a0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
197b0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
197c0 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
197d0 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
197e0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
197f0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
19800 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
19810 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
19820 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
19830 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19840 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
19850 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
19860 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
19870 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
19880 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
19890 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
198a0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
198b0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
198c0 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
198d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
198e0 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
198f0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
19900 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
19910 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
19920 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19930 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
19940 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19950 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
19960 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
19970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19980 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
19990 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
199a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
199b0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
199c0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
199d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
199e0 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
199f0 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
19a00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
19a10 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
19a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19a60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
19a70 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
19a80 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
19a90 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
19aa0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
19ab0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
19ac0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
19ad0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
19ae0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
19af0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
19b00 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
19b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19b20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
19b30 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
19b40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19b50 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
19b60 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
19b70 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
19b80 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
19b90 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
19ba0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
19bb0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
19bc0 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
19bd0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
19be0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
19bf0 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
19c00 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19c10 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
19c20 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19c30 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19c40 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19c50 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
19c60 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
19c70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19c80 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
19c90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19ca0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
19cb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
19cc0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
19cd0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
19ce0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19cf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19d00 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
19d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
19d20 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
19d30 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
19d40 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
19d50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
19d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
19d70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
19d80 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
19d90 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
19da0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
19db0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
19dc0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
19dd0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
19de0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
19df0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
19e00 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
19e10 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
19e20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
19e30 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
19e40 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
19e50 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
19e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19e70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
19e80 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
19e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
19ea0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
19eb0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
19ec0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
19ed0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
19ee0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
19ef0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
19f00 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
19f10 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
19f20 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
19f30 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
19f40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
19f50 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
19f60 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
19f70 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
19f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
19f90 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
19fa0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
19fb0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
19fc0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
19fd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
19fe0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
19ff0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1a000 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
1a010 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1a020 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1a030 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1a040 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1a050 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1a060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1a070 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20 20  zPg)).          
1a080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a090 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1a0a0 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
1a0b0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1a0c0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1a0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a0e0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1a0f0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1a100 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1a110 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1a120 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1a130 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1a140 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1a150 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1a160 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1a170 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1a180 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1a190 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1a1a0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1a1b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a1c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a1d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a1e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a1f0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1a200 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1a210 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1a220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a230 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1a240 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1a250 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1a260 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1a270 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1a280 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1a290 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1a2a0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1a2b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1a2c0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1a2d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1a2e0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a2f0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a300 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a310 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
1a320 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1a330 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Pg);.          }
1a340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a360 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1a370 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1a380 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1a390 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1a3a0 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45      TRACE4("APPE
1a3b0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1a3c0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1a3e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1a3f0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1a400 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1a410 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1a420 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1a430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1a440 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1a450 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
1a460 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1a470 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
1a480 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1a490 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
1a4a0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
1a4b0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
1a4c0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
1a4d0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
1a4e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1a4f0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
1a500 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
1a510 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
1a520 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
1a530 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
1a540 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
1a550 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
1a560 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
1a570 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
1a580 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
1a590 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1a5a0 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1a5b0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1a5c0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1a5d0 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1a5e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1a5f0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1a600 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1a610 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1a620 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1a630 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1a640 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1a650 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1a660 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1a670 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1a680 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1a690 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1a6a0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1a6b0 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1a6c0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1a6d0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1a6e0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1a6f0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1a700 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1a710 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1a720 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52      }.        TR
1a740 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1a750 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1a760 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a770 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1a780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a790 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1a7a0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1a7b0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1a7c0 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1a7d0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1a7e0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1a7f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a800 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1a810 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1a820 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a830 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54  ze+4);.        T
1a840 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1a850 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1a860 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1a870 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1a880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1a890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a8a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1a8b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a8c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1a8d0 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
1a8e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a8f0 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1a900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1a910 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1a920 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1a930 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
1a940 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1a950 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1a960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a970 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1a980 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1a990 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1a9a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a9b0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1a9c0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1a9d0 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
1a9e0 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1a9f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1aa00 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1aa10 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
1aa20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
1aa30 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
1aa40 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1aa50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1aa60 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1aa70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1aa80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1aa90 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
1aaa0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1aab0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
1aac0 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
1aad0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1aae0 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
1aaf0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
1ab00 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
1ab10 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
1ab20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1ab30 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
1ab40 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
1ab50 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
1ab60 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
1ab70 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1ab80 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1ab90 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
1aba0 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
1abb0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1abc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
1abd0 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
1abe0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
1abf0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
1ac00 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
1ac10 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
1ac20 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
1ac30 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1ac40 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  overwrite(Pager 
1ac50 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1ac60 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
1ac70 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
1ac80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
1ac90 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1aca0 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  get(pPager, pgno
1acb0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
1acc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1acd0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1ace0 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
1acf0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ad00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ad10 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
1ad20 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  e, pData, pPager
1ad30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1ad40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
1ad50 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1ad60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ad70 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1ad80 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1ad90 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1ada0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1adb0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1adc0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1add0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1ade0 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
1adf0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
1ae00 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
1ae10 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
1ae20 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
1ae30 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
1ae40 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1ae50 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1ae60 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1ae70 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1ae80 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1ae90 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1aea0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1aeb0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1aec0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1aed0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1aee0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1aef0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1af00 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1af10 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1af20 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1af30 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
1af40 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
1af50 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
1af60 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
1af70 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
1af80 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
1af90 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
1afa0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
1afb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1afc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1afd0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
1afe0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1aff0 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
1b000 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1b010 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
1b020 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
1b030 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1b040 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1b050 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1b060 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1b070 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1b080 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1b090 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1b0a0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1b0b0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1b0c0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1b0d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1b0e0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1b0f0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1b100 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1b110 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1b120 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1b130 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1b140 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1b150 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1b160 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1b170 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1b180 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1b190 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1b1a0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
1b1b0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1b1c0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1b1d0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
1b1e0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
1b1f0 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1b200 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1b210 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
1b220 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
1b230 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
1b240 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
1b250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1b260 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
1b270 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1b280 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1b290 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1b2a0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1b2b0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1b2c0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1b2d0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
1b2e0 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  Pg!=0 );  /* We 
1b2f0 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74  never call _dont
1b300 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68  _write unless th
1b310 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d  e page is in mem
1b320 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79   */.  pPg->alway
1b330 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1b340 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1b350 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1b360 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1b370 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b380 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1b390 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1b3a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1b3b0 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1b3c0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1b3d0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1b3e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1b3f0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1b400 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1b410 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1b420 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1b430 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1b440 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1b450 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1b460 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1b470 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1b480 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1b490 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1b4a0 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1b4b0 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1b4c0 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1b4d0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1b4e0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1b4f0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1b500 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1b510 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1b520 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1b530 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1b540 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1b550 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1b560 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1b570 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1b580 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1b590 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1b5a0 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1b5b0 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1b5c0 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1b5d0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1b5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
1b5f0 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1b600 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1b610 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  ", pgno, PAGERID
1b620 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1b630 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
1b640 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1b650 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  r, pgno)).      
1b660 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1b670 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1b680 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
1b690 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1b6a0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1b6b0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
1b6c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1b6d0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1b6e0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1b6f0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
1b700 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
1b710 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
1b720 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
1b730 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
1b740 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
1b750 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
1b760 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
1b770 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
1b780 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
1b790 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
1b7a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1b7b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1b7c0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
1b7d0 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
1b7e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1b7f0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
1b800 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
1b810 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1b820 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ger;..  assert( 
1b830 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1b840 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1b850 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1b860 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
1b870 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1b880 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1b890 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
1b8a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
1b8b0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1b8c0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1b8d0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
1b8e0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1b8f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1b900 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b910 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1b920 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1b930 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
1b940 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1b950 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1b960 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1b970 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
1b980 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1b990 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1b9a0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1b9b0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1b9c0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1b9d0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1b9e0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1b9f0 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44   }.    TRACE3("D
1ba00 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
1ba10 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1ba20 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1ba30 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1ba40 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
1ba50 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
1ba60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1ba70 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1ba80 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
1ba90 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
1baa0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1bab0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1bac0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bad0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1bae0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1baf0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1bb00 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
1bb10 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1bb20 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
1bb30 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1bb40 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1bb50 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1bb60 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
1bb70 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
1bb80 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  }.}.../*.** Comm
1bb90 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
1bba0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
1bbb0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
1bbc0 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
1bbd0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
1bbe0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
1bbf0 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
1bc00 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
1bc10 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1bc20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1bc30 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
1bc40 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
1bc50 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1bc60 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1bc70 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61  3pager_commit(Pa
1bc80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1bc90 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
1bca0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
1bcb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1bcc0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1bcd0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1bce0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bcf0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
1bd00 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
1bd10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1bd20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d   }.  TRACE2("COM
1bd30 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1bd40 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
1bd50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1bd60 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
1bd70 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
1bd80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
1bd90 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
1bda0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
1bdb0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1bdc0 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
1bdd0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1bde0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1bdf0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1be00 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
1be10 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1be20 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
1be30 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
1be40 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1be50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
1be60 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1be70 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1be80 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  >pDirty = 0;.#if
1be90 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1bea0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1beb0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1bec0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1bed0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1bee0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1bef0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1bf00 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1bf10 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1bf20 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1bf30 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1bf40 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1bf50 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1bf60 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1bf70 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1bf80 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1bf90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1bfa0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1bfb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bfc0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1bfd0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1bfe0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78  ==0 ){.    /* Ex
1bff0 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75  it early (withou
1c000 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65  t doing the time
1c010 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74  -consuming sqlit
1c020 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73  e3OsSync() calls
1c030 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
1c040 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
1c050 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1c060 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1c070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c080 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
1c090 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1c0a0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1c0b0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
1c0c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1c0d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c0e0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
1c0f0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
1c100 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ync(pPager, 0, 0
1c110 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c130 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1c140 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1c150 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c160 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1c170 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
1c180 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
1c190 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
1c1a0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
1c1b0 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
1c1c0 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
1c1d0 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
1c1e0 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
1c1f0 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
1c200 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1c210 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c220 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
1c230 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
1c240 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
1c250 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
1c260 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
1c270 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
1c280 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
1c290 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
1c2a0 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
1c2b0 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
1c2c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c2d0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
1c2e0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
1c2f0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
1c300 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
1c310 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
1c320 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
1c330 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
1c340 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
1c350 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
1c360 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
1c370 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1c380 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1c390 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
1c3a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c3b0 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52   rc;.  TRACE2("R
1c3c0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
1c3d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c3e0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1c3f0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1c400 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1c410 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
1c420 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
1c430 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
1c440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c450 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  p->alwaysRollbac
1c460 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  k );.      if( !
1c470 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
1c480 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
1c490 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
1c4a0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
1c4b0 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  er))->pOrig );. 
1c4c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1c4d0 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1c4e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1c4f0 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29  Pager))->pStmt )
1c500 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
1c510 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
1c520 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
1c530 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
1c540 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
1c550 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
1c560 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
1c570 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
1c580 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
1c590 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c5a0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
1c5b0 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
1c5c0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
1c5d0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1c5e0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
1c5f0 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43  se{.        TRAC
1c600 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
1c610 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
1c620 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1c630 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1c640 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
1c650 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
1c660 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
1c670 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
1c680 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1c690 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1c6a0 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
1c6b0 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
1c6c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1c6d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1c6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c6f0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
1c700 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
1c710 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1c740 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
1c750 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1c760 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c770 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
1c780 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
1c790 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1c7a0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1c7b0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1c7c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1c7d0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1c7e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c7f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1c800 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
1c810 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
1c820 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1c830 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1c840 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1c850 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
1c860 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
1c870 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1c880 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1c890 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1c8a0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1c8b0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1c8c0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
1c8d0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
1c8e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1c8f0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1c900 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1c910 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c920 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
1c930 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
1c940 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
1c950 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
1c960 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1c970 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  2 = pager_unwrit
1c980 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1c990 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c9a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c9b0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
1c9c0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1c9d0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1c9e0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50  Pager);.  }.  pP
1c9f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1ca00 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
1ca10 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
1ca20 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
1ca30 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
1ca40 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
1ca50 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
1ca60 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
1ca70 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
1ca80 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
1ca90 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
1caa0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ent..  */.  retu
1cab0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1cac0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
1cad0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1cae0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1caf0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1cb00 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
1cb10 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
1cb20 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
1cb30 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
1cb40 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
1cb50 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f  te3pager_isreado
1cb60 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
1cb70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1cb80 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
1cb90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cba0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1cbb0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1cbc0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
1cbd0 69 74 65 33 70 61 67 65 72 5f 72 65 66 63 6f 75  ite3pager_refcou
1cbe0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1cbf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1cc00 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
1cc10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1cc20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cc30 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
1cc40 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1cc50 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
1cc60 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73   *sqlite3pager_s
1cc70 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
1cc80 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
1cc90 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
1cca0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
1ccb0 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
1ccc0 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
1ccd0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
1cce0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
1ccf0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
1cd00 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
1cd10 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
1cd20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
1cd30 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
1cd40 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
1cd50 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
1cd60 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66  ] = pPager->nOvf
1cd70 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  l;.  a[9] = pPag
1cd80 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
1cd90 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
1cda0 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
1cdb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1cdc0 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
1cdd0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
1cde0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
1cdf0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
1ce00 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
1ce10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1ce20 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
1ce30 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
1ce40 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
1ce50 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
1ce60 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
1ce70 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
1ce80 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
1ce90 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
1cea0 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
1ceb0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1cec0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
1ced0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
1cee0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1cef0 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
1cf00 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
1cf10 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ];.  assert( !pP
1cf20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1cf30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1cf40 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cf50 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
1cf60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1cf70 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
1cf80 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
1cf90 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1cfa0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1cfb0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
1cfc0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1cfd0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1cfe0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1cff0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
1d000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d010 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1d020 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1d030 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1d040 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
1d050 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d060 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1d070 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1d080 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
1d090 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
1d0a0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1d0b0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1d0c0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1d0d0 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
1d0e0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
1d0f0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1d100 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
1d110 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1d120 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1d130 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1d140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1d150 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1d160 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
1d170 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
1d180 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
1d190 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
1d1a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d1b0 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
1d1c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d1d0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
1d1e0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
1d1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d200 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
1d210 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1d220 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
1d230 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
1d240 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1d250 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
1d260 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
1d270 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
1d280 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
1d290 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
1d2a0 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
1d2b0 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
1d2c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
1d2d0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
1d2e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1d2f0 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
1d300 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1d310 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1d320 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
1d330 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d340 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
1d350 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
1d360 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1d370 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1d380 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
1d390 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
1d3a0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
1d3b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d3c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1d3d0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
1d3e0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d3f0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  stmt_commit(Page
1d400 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
1d410 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1d420 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
1d430 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
1d440 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
1d450 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1d460 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1d470 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
1d480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1d490 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
1d4a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
1d4b0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1d4c0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1d4d0 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1d4e0 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1d4f0 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1d500 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1d510 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1d520 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1d530 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1d540 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1d550 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1d560 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1d570 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1d580 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1d590 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1d5a0 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1d5b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1d5c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1d5d0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1d5e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1d5f0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1d600 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1d610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1d620 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1d630 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1d640 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1d650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1d660 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1d670 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1d680 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1d690 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1d6a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1d6b0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1d6c0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1d6d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d6e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1d6f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1d700 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1d710 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1d720 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1d730 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1d740 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1d750 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1d760 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1d770 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d780 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1d790 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1d7a0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1d7b0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1d7c0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1d7d0 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1d7e0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1d7f0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1d800 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1d810 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1d820 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1d830 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1d840 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1d850 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1d860 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1d870 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1d880 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1d890 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1d8a0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1d8b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1d8c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1d8d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1d8e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1d8f0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1d900 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1d910 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d920 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1d930 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1d940 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1d950 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1d960 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1d970 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1d980 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1d990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d9a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1d9b0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1d9c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d9d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d9e0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1d9f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1da00 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1da10 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1da20 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1da30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1da40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1da50 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1da60 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1da70 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1da80 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1da90 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1daa0 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1dab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1dac0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1dad0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1dae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1daf0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1db00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1db10 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1db20 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1db30 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1db40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1db50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1db60 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1db70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1db80 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1db90 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1dba0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1dbb0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1dbc0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1dbd0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1dbe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1dbf0 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  r_nosync(Pager *
1dc00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1dc10 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
1dc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1dc30 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1dc40 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1dc50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1dc60 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1dc70 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1dc80 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
1dc90 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
1dca0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
1dcb0 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
1dcc0 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
1dcd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
1dce0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
1dcf0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
1dd00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1dd10 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
1dd20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dd30 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1dd40 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
1dd50 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
1dd60 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
1dd70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
1dd80 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1dd90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1dda0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
1ddb0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
1ddc0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1ddd0 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
1dde0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65  ..  /* Open page
1ddf0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
1de00 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
1de10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1de20 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31  er_get(pPager, 1
1de30 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
1de40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1de50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
1de60 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1de70 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1de80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1de90 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1dea0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75    /* Read the cu
1deb0 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62  rrent value at b
1dec0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67  yte 24. */.  pPg
1ded0 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  Hdr = DATA_TO_PG
1dee0 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68  HDR(pPage);.  ch
1def0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72  ange_counter = r
1df00 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
1df10 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
1df20 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1df30 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1df40 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1df50 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1df60 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1df70 2b 2b 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  ++;.  put32bits(
1df80 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  ((char*)PGHDR_TO
1df90 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32  _DATA(pPgHdr))+2
1dfa0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1dfb0 72 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  r);..  /* Releas
1dfc0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1dfd0 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ence. */.  sqlit
1dfe0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1dff0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  age);.  return S
1e000 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e010 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
1e020 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1e030 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
1e040 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
1e050 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
1e060 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1e070 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
1e080 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
1e090 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
1e0a0 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
1e0b0 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
1e0c0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
1e0d0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
1e0e0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
1e0f0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
1e100 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1e110 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
1e120 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
1e130 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1e140 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
1e150 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
1e160 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
1e170 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1e180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e190 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
1e1a0 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
1e1b0 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
1e1c0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1e1d0 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
1e1e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e1f0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
1e200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1e210 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
1e220 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
1e230 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
1e240 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
1e250 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
1e260 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
1e270 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61   to an sqlite3pa
1e280 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ger_sync() call.
1e290 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1e2a0 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1e2b0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1e2c0 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1e2d0 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1e2e0 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1e2f0 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1e300 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e310 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1e320 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61  te3pager_sync(Pa
1e330 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
1e340 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1e350 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a  , Pgno nTrunc){.
1e360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e370 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28  E_OK;..  TRACE4(
1e380 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
1e390 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
1e3a0 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
1e3b0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1e3c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
1e3d0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20  er, nTrunc);..  
1e3e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1e3f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
1e400 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
1e410 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
1e420 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
1e430 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
1e440 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
1e450 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
1e460 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1e470 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
1e480 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
1e490 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
1e4a0 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
1e4b0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
1e4c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1e4d0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
1e4e0 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
1e4f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1e500 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1e510 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1e520 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
1e530 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
1e540 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
1e550 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1e560 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
1e570 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
1e580 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
1e590 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1e5a0 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
1e5b0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1e5c0 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
1e5d0 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
1e5e0 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
1e5f0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1e600 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
1e610 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
1e620 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1e630 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
1e640 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
1e650 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
1e660 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
1e670 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1e680 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1e690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e6a0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e6b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e6c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1e6d0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e  .      if( nTrun
1e6e0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
1e6f0 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
1e700 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
1e710 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
1e720 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
1e730 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ages.        ** 
1e740 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
1e750 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
1e760 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
1e770 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1e780 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1e790 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1e7a0 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
1e7b0 20 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65       void *pPage
1e7c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53  ;.        int iS
1e7d0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
1e7e0 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20  GNO(pPager);.   
1e7f0 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
1e800 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
1e810 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
1e820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e830 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ( !(pPager->aInJ
1e840 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31  ournal[i/8] & (1
1e850 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d  <<(i&7))) && i!=
1e860 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
1e870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e880 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1e890 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
1e8a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1e8b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1e8c0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1e8d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e8e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1e8f0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1e900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
1e910 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1e920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e940 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e950 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e960 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1e970 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1e980 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1e990 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1e9a0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
1e9b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e9c0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e9d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
1e9e0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1e9f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ea00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ea10 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ea20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ea30 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ea40 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1ea50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1ea60 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
1ea70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1ea80 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
1ea90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eaa0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1eab0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1eac0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
1ead0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
1eae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eaf0 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
1eb00 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1eb10 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1eb20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1eb30 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1eb40 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1eb50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1eb60 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
1eb70 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
1eb80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1eb90 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1eba0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1ebb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ebc0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
1ebd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1ebe0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
1ebf0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1ec00 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1ec10 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1ec20 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
1ec30 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
1ec40 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
1ec50 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
1ec60 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1ec70 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
1ec80 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1ec90 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1eca0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ecb0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1ecc0 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1ecd0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1ece0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1ecf0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1ed00 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1ed10 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1ed20 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1ed30 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1ed40 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1ed50 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1ed60 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1ed70 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1ed80 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1ed90 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1eda0 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1edb0 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1edc0 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1edd0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1ede0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1edf0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1ee00 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1ee10 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1ee20 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1ee30 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1ee40 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1ee50 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1ee60 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1ee70 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1ee80 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1ee90 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1eea0 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1eeb0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1eec0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1eed0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1eee0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1eef0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1ef00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ef10 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1ef20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1ef30 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1ef40 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1ef50 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1ef60 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1ef70 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1ef80 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1ef90 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1efa0 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1efb0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1efc0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1efd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1efe0 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1eff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1f000 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1f010 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1f020 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1f030 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1f040 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1f050 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1f060 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1f070 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1f080 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1f090 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1f0a0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1f0b0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1f0c0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1f0d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1f0e0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1f0f0 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
1f100 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
1f110 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1f120 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
1f130 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  ))..  if( pPg->n
1f140 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
1f150 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
1f160 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
1f170 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1f180 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
1f190 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
1f1a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f1b0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1f1c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
1f1d0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
1f1e0 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
1f1f0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
1f200 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
1f210 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
1f220 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
1f230 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
1f240 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
1f250 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
1f260 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
1f270 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
1f280 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
1f290 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
1f2a0 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
1f2b0 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
1f2c0 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
1f2d0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
1f2e0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
1f2f0 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
1f300 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
1f310 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1f320 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
1f330 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
1f340 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
1f350 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
1f360 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
1f370 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
1f380 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
1f390 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d  .    if( pPgOld-
1f3a0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1f3b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
1f3c0 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  d->inJournal );.
1f3d0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1f3e0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
1f3f0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1f400 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1f410 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1f420 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  c );.    }.  }..
1f430 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
1f440 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
1f450 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69  pPg and insert i
1f460 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68  t into the new h
1f470 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20  ash-chain. */.  
1f480 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
1f490 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  );.  pPg->pgno =
1f4a0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e   pgno;.  h = pgn
1f4b0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
1f4c0 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61  sh-1);.  if( pPa
1f4d0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b  ger->aHash[h] ){
1f4e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f4f0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
1f500 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
1f510 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
1f520 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
1f530 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
1f540 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
1f550 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
1f560 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f570 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  ] = pPg;.  pPg->
1f580 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a  pPrevHash = 0;..
1f590 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
1f5a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
1f5b0 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69  yCache = 1;..  i
1f5c0 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
1f5d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
1f5e0 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
1f5f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1f600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
1f610 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
1f620 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1f630 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
1f640 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
1f650 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
1f660 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
1f670 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
1f680 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
1f690 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
1f6a0 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
1f6b0 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61   Pager.aInJourna
1f6c0 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73  l bit has been s
1f6d0 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
1f6e0 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
1f6f0 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   loading.    ** 
1f700 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
1f710 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1f720 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
1f730 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
1f740 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
1f750 20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   The sqlite3page
1f760 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  r_get() call may
1f770 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
1f780 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
1f790 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1f7a0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
1f7b0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
1f7c0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
1f7d0 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20  nt rc;.    void 
1f7e0 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20  *pNeedSync;.    
1f7f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f800 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
1f810 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1f820 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65  r_get(pPager, ne
1f830 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65  edSyncPgno, &pNe
1f840 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28  edSync);.    if(
1f850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f870 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1f880 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54   = 1;.    DATA_T
1f890 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e  O_PGHDR(pNeedSyn
1f8a0 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  c)->needSync = 1
1f8b0 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47  ;.    DATA_TO_PG
1f8c0 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e  HDR(pNeedSync)->
1f8d0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1f8e0 20 20 20 6d 61 6b 65 44 69 72 74 79 28 44 41 54     makeDirty(DAT
1f8f0 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64  A_TO_PGHDR(pNeed
1f900 53 79 6e 63 29 29 3b 0a 20 20 20 20 73 71 6c 69  Sync));.    sqli
1f910 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1f920 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a  NeedSync);.  }..
1f930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f940 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
1f950 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f960 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1f970 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1f980 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f990 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1f9a0 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
1f9b0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
1f9c0 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
1f9d0 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
1f9e0 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
1f9f0 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
1fa00 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
1fa10 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
1fa20 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
1fa30 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1fa40 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  lockstate(Pager 
1fa50 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1fa60 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
1fa70 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
1fa80 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
1fa90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1faa0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
1fab0 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
1fac0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
1fad0 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
1fae0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1faf0 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70  te3pager_refdump
1fb00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fb10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1fb20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1fb30 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1fb40 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1fb50 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
1fb60 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
1fb70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1fb80 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
1fb90 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
1fba0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
1fbb0 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
1fbc0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
1fbd0 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
1fbe0 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
1fbf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
1fc00 4b 49 4f 20 2a 2f 0a                             KIO */.