/ Hex Artifact Content
Login

Artifact 3688e882a10a693cbdc9303426d3a52b8f48ccd5:


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 39  : pager.c,v 1.29
0350: 31 20 32 30 30 37 2f 30 33 2f 31 39 20 31 33 3a  1 2007/03/19 13:
0360: 35 33 3a 33 38 20 64 61 6e 69 65 6c 6b 31 39 37  53:38 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 20 20 69 6e 74 20 64 6f 4e 6f  se */.  int doNo
3680: 74 53 79 6e 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tSync;.};../*.**
3690: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
36a0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
36b0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
36c0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
36d0: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
36e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36f0: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3700: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3710: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3720: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  dif../*.** Journ
3740: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3750: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3760: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3770: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3780: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3790: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
37a0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
37b0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
37c0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
37d0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
37e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
37f0: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3800: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3810: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3820: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3830: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3840: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3850: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3860: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3870: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3880: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3890: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
38a0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
38b0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
38c0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
38d0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
38e0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
38f0: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3900: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3910: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3920: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3930: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3940: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3950: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3960: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3970: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3980: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3990: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
39a0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
39b0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
39c0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
39d0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
39e0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
39f0: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3a00: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3a10: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3a20: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3a30: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3a40: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3a50: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3a60: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3a70: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3a80: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3a90: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3aa0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3ab0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3ac0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3ad0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3ae0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3af0: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3b00: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3b10: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3b20: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3b30: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3b40: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3b50: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3b60: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3b70: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3b80: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3b90: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3ba0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3bb0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3bc0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3bd0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3be0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3bf0: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3c00: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3c10: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3c20: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3c30: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3c40: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3c50: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3c60: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3c70: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3c80: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3c90: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3ca0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3cb0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3cc0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3cd0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3ce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3cf0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3d00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3d10: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3d20: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3d30: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3d40: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3d50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3d60: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3d70: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3d80: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3d90: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3da0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
3dc0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
3dd0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
3de0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
3df0: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
3e00: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3e10: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3e20: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3e30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3e40: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3e50: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3e60: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3e70: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3e80: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
3e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3ea0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
3eb0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
3ec0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
3ed0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
3ee0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
3ef0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
3f00: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3f10: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3f20: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3f30: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3f40: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3f50: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3f60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3f70: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3f80: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
3f90: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
3fa0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
3fb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
3fc0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
3fd0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
3fe0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
3ff0: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4000: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4010: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4020: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4030: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4040: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4050: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4060: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
4070: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
4080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4090: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40a0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40c0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
40d0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
40e0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
40f0: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4100: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4110: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4120: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4130: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4140: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4150: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4160: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
4170: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
4180: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
4190: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41a0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
41d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
41e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
41f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4200: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4210: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4220: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4230: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4250: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  T.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25  Ref=%-3d total=%
4320: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
4330: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
4340: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c  ATA(p), p->nRef,
4350: 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66   p->pPager->nRef
4360: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
4370: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
4380: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
4390: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
43a0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43b0: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
43c0: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
43d0: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
43e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
43f0: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
4400: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
4410: 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20   table to N.  N 
4420: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 0a  must be a power.
4430: 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74  ** of two..*/.st
4440: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4450: 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
4460: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
4470: 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64 72   int N){.  PgHdr
4480: 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a   **aHash, *pPg;.
4490: 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26 26    assert( N>0 &&
44a0: 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b   (N&(N-1))==0 );
44b0: 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74  .  aHash = sqlit
44c0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
44d0: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
44e0: 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b   if( aHash==0 ){
44f0: 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20  .    /* Failure 
4500: 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74  to rehash is not
4510: 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69   an error.  It i
4520: 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d  s only a perform
4530: 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20  ance hit. */.   
4540: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
4550: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
4560: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
4570: 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20  er->nHash = N;. 
4580: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
4590: 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50   aHash;.  for(pP
45a0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
45b0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
45c0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74  extAll){.    int
45d0: 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   h;.    if( pPg-
45e0: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
45f0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
4600: 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
4610: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
4620: 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
4630: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20  ue;.    }.    h 
4640: 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e  = pPg->pgno & (N
4650: 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  -1);.    pPg->pN
4660: 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b  extHash = aHash[
4670: 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73  h];.    if( aHas
4680: 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48  h[h] ){.      aH
4690: 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
46a0: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
46b0: 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50     aHash[h] = pP
46c0: 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  g;.    pPg->pPre
46d0: 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  vHash = 0;.  }.}
46e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
46f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
4700: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
4710: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
4720: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
4730: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
4740: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
4750: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
4760: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
4770: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
4780: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4790: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
47a0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
47b0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
47c0: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
47d0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
47e0: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
47f0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
4800: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
4810: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
4820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
4830: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
4840: 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20 72  of(ac));.  if( r
4850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4860: 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63 5b      *pRes = (ac[
4870: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4880: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4890: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a  8) | ac[3];.  }.
48a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
48b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
48c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
48d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
48e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
48f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  byte order..*/.s
4900: 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33 32  tatic void put32
4910: 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20 75  bits(char *ac, u
4920: 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30 5d  32 val){.  ac[0]
4930: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
4940: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
4950: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
4960: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
4970: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
4980: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
4990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
49a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
49b0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
49c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
49d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
49e0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
49f0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4a00: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4a10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4a20: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4a30: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
4a40: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4a50: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4a60: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4a70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4a80: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4a90: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  4);.}../*.** Rea
4aa0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4ab0: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
4ac0: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
4ad0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4ae0: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
4af0: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
4b00: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
4b10: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
4b20: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4b30: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4b40: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4b50: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4b60: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4b70: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
4b80: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4b90: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4ba0: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
4bb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4bc0: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
4bd0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72  lled when an err
4be0: 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
4bf0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f   the pager.** co
4c00: 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  de. The first ar
4c10: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
4c20: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
4c30: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a   structure, the.
4c40: 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  ** second the er
4c50: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
4c60: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
4c70: 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
4c80: 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76  ction. .** The v
4c90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
4ca0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
4cb0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
4cc0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
4cd0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
4ce0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
4cf0: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
4d00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f  SQLITE_CORRUPT o
4d10: 72 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  r SQLITE_PROTOCO
4d20: 4c 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  L,.** the error 
4d30: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
4d40: 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65  nt. All subseque
4d50: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
4d60: 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69  this Pager.** wi
4d70: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
4d80: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65  eturn the same e
4d90: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
4da0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4db0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4dc0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4dd0: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4de0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
4df0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
4e00: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50  QLITE_FULL || pP
4e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
4e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
4e30: 28 20 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ( .    rc2==SQLI
4e40: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4e50: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4e60: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e70: 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 0a 20  ITE_CORRUPT ||. 
4e80: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 50     rc2==SQLITE_P
4e90: 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a 20 20 20  ROTOCOL.  ){.   
4ea0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4eb0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
4ec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
4ed0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
4ee0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
4ef0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
4f00: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
4f10: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
4f20: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
4f30: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
4f40: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
4f50: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
4f60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4f70: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
4f80: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
4f90: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
4fa0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4fb0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
4fc0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
4fd0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
4fe0: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
4ff0: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
5000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
5010: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
5020: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
5030: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
5040: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5050: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
5060: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
5070: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
5080: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
5090: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
50a0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
50b0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
50c0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
50d0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
50e0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
50f0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
5100: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
5110: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
5120: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
5130: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
5140: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
5150: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
5160: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
5170: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
5180: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
5190: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
51a0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
51b0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
51c0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
51d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
51e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
51f0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5200: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5210: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5220: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5230: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5240: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5250: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
5260: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
5270: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
5280: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
5290: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
52a0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
52b0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
52c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
52d0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
52e0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
52f0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
5300: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
5310: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
5320: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
5330: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5340: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5350: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5360: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5370: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5380: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5390: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
53a0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
53b0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
53c0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
53d0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
53e0: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
53f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5400: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5410: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5420: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5430: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5440: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5450: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5460: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5470: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5480: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
5490: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
54a0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
54b0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
54c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
54d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
54e0: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
54f0: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5500: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5510: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5520: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5530: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5540: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5550: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5560: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5570: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
5580: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
5590: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
55a0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
55b0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
55c0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
55d0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
55e0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
55f0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5600: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5610: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5620: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
5630: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5640: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5650: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5660: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5670: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
5680: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5690: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
56a0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
56b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
56c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
56d0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
56e0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
56f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5700: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
5710: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
5720: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
5730: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5750: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5760: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5770: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
5780: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
5790: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
57a0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
57b0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
57c0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
57d0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
57e0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
57f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5800: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5810: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5820: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5830: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5850: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5860: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5870: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5880: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5890: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
58a0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
58b0: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
58c0: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
58d0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
58e0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
58f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5900: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
5910: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5920: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
5930: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5940: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5950: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5960: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5970: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5980: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5990: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
59a0: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
59b0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
59c0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
59d0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
59e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
59f0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5ac0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5ad0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5ae0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5af0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5b00: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5b10: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5b20: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5b30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5b40: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5b50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5b60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5b70: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5b80: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5b90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5ba0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5bb0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5bc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5bd0: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5be0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5bf0: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
5c00: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5c10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5c20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
5c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5c40: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5c50: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5c70: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5c80: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5c90: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5ca0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5cc0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5cd0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5ce0: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5cf0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5d00: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5d10: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5d20: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5d30: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5d40: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5d50: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5d60: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5d70: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5d80: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5d90: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5da0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5db0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5dc0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5dd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5de0: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5df0: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5e00: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5e10: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5e20: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
5e30: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
5e40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
5e50: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
5e60: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
5e70: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
5e80: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5e90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72  *pPager){.  char
5ea0: 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
5eb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
5ec0: 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  6];.  int rc;.. 
5ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5ee0: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5ef0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f00: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f10: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
5f20: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
5f30: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
5f40: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5f50: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
5f60: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
5f70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5f80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5f90: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
5fa0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5fb0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
5fc0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
5fd0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
5fe0: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
5ff0: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
6000: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
6010: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
6020: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
6030: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6040: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6050: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6060: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6070: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
6080: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
6090: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
60a0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
60b0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
60c0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
60d0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
60e0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
60f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6100: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
6110: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
6120: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
6130: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6140: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6150: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6160: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6170: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
6180: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
6190: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
61a0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
61b0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
61c0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
61d0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
61e0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
61f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6200: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6210: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6220: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6230: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6240: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6250: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6260: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6270: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6280: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
6290: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
62a0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
62b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
62c0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
62d0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
62e0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
62f0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
6300: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6310: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
6320: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
6330: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
6340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6350: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6360: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
6370: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6380: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
6390: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
63a0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
63b0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
63c0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
63d0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
63e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
63f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6400: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6410: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6420: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6430: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6440: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
6450: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
6460: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
6470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6480: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
6490: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
64a0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
64b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
64c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
64d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
64e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
64f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
6500: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d  \000", 1);.    }
6510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6540: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
6550: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
6560: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6570: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
6580: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
6590: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
65a0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
65b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
65c0: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
65d0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
65e0: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
65f0: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6600: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6610: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6620: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6630: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
6640: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6650: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
6660: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6670: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
6680: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
6690: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
66a0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
66b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
66c0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
66d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
66e0: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
66f0: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6700: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6710: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6720: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6730: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6740: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6750: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6760: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6770: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6780: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
6790: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
67a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
67b0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
67c0: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
67d0: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
67e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
67f0: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6800: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6820: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6830: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6840: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6850: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6860: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6870: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6880: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6890: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
68a0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
68b0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
68c0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
68d0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
68e0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
68f0: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6900: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6910: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6920: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6930: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
6940: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6950: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
6960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6970: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6980: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
6990: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
69a0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
69b0: 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  aMagic));.  if( 
69c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
69d0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
69e0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
69f0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6a00: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6a10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6a20: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6a30: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6a40: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
6a50: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a60: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6a70: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6a80: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
6a90: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
6aa0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6ab0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6ac0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6ad0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6ae0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6af0: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6b00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6b10: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6b20: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6b30: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6b40: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6b50: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6b60: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
6b70: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
6b80: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
6b90: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
6ba0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6bb0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6bc0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6bd0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6be0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6bf0: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6c00: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6c10: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6c20: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6c30: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6c40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6c50: 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a  ger->jfd, (u32 *
6c60: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
6c70: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6c80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ca0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
6cb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6cc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6cd0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6ce0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6cf0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
6d00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6d10: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
6d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6d30: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
6d40: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6d50: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6d60: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6d70: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6d80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6d90: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6da0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6db0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6dc0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6dd0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
6de0: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
6df0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
6e00: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
6e10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
6e20: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
6e30: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
6e40: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
6e50: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
6e60: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
6e70: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
6e80: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
6e90: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6ea0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
6eb0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
6ec0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
6ed0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
6ee0: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
6ef0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
6f00: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
6f10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
6f20: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
6f30: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
6f40: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
6f50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
6f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
6f70: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
6f80: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
6f90: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
6fa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
6fb0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
6fc0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
6fd0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
6fe0: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
6ff0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
7000: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
7010: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7020: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
7030: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
7040: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
7050: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7060: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
7070: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
7080: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
7090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
70a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
70b0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
70c0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
70d0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
70e0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
70f0: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
7100: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
7110: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
7120: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
7130: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
7140: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
7150: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
7160: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7170: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
7180: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
7190: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
71a0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
71b0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
71c0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
71d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
71e0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
71f0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7200: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
7210: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7220: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7230: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7240: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
7250: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
7260: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7270: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
7280: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
7290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
72a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
72c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
72d0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
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 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7310: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7320: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7330: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7340: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7350: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7360: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7370: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7380: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7390: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
73a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
73b0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
73c0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
73d0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75  ->noSync;.  retu
73e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
73f0: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
7400: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
7410: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
7420: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
7430: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
7440: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
7450: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
7460: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
7470: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
7480: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
7490: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
74a0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
74b0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
74c0: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
74d0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
74e0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
74f0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
7500: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
7510: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
7520: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
7530: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
7540: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7550: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
7560: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
7570: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
7580: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
7590: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
75a0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
75b0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
75c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
75d0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
75e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
75f0: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
7600: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
7610: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
7620: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
7630: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7640: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
7650: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7660: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
7670: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
7680: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
7690: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
76a0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
76b0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
76c0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
76d0: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
76e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
76f0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
7700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
7710: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
7720: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
7730: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
7740: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
7750: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
7760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
7770: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
7780: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
7790: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
77a0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
77b0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
77c0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
77d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
77e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
77f0: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
7800: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
7810: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7820: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
7830: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
7840: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
7850: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
7860: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
7870: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
7880: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7890: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
78a0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
78b0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
78c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
78d0: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
78e0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
78f0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7900: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7910: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7920: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7930: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
7940: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
7950: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
7960: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
7970: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
7980: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
7990: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
79a0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
79b0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
79c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
79d0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
79e0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  se file..**.** O
79f0: 6e 63 65 20 61 6c 6c 20 6c 6f 63 6b 73 20 68 61  nce all locks ha
7a00: 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  ve been removed 
7a10: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
7a20: 65 20 66 69 6c 65 2c 20 6f 74 68 65 72 0a 2a 2a  e file, other.**
7a30: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 20 74 68   processes or th
7a40: 72 65 61 64 73 20 6d 69 67 68 74 20 63 68 61 6e  reads might chan
7a50: 67 65 20 74 68 65 20 66 69 6c 65 2e 20 20 53 6f  ge the file.  So
7a60: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6f   make sure all o
7a70: 66 0a 2a 2a 20 6f 75 72 20 69 6e 74 65 72 6e 61  f.** our interna
7a80: 6c 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c  l cache is inval
7a90: 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
7aa0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
7ab0: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
7ac0: 72 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r){.  if( !MEMDB
7ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7ae0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7af0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7b00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7b10: 20 3d 20 2d 31 3b 0a 20 20 20 20 49 4f 54 52 41   = -1;.    IOTRA
7b20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
7b30: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 7d 0a  ", pPager)).  }.
7b40: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7b50: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7b60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7b70: 2d 3e 70 41 6c 6c 3d 3d 30 20 29 3b 0a 7d 0a 0a  ->pAll==0 );.}..
7b80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
7b90: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
7ba0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
7bb0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
7bc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
7bd0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
7be0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
7bf0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
7c00: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
7c10: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
7c20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
7c30: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
7c40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
7c50: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
7c60: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
7c70: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
7c80: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
7c90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7ca0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
7cb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
7cc0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
7cd0: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
7ce0: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
7cf0: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
7d00: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7d10: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
7d20: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
7d30: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
7d40: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
7d50: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
7d60: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7d70: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
7d80: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
7d90: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
7da0: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
7db0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
7dc0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
7dd0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
7de0: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
7df0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
7e00: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7e10: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 69 66  >aHash = 0;.  if
7e20: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
7e30: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
7e40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
7e50: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
7e60: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  ger);.  }.  page
7e70: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
7e80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
7e90: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7ea0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
7eb0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
7ec0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
7ed0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
7ee0: 30 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0) );.}../*.** W
7ef0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7f00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
7f10: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
7f20: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
7f30: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
7f40: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
7f50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
7f60: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
7f70: 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74  ne releases.** t
7f80: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
7f90: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
7fa0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
7fb0: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
7fc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69  ournal.** file i
7fd0: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
7fe0: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
7ff0: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
8000: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
8010: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
8020: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
8030: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
8040: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
8050: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
8060: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
8070: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
8080: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
8090: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
80a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
80b0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
80c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
80d0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
80e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
80f0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
8100: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
8110: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8120: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8130: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
8140: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
8150: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
8160: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
8170: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
8180: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
8190: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
81a0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
81b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
81c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
81d0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
81e0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
81f0: 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  >jfd);.    pPage
8200: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8210: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0;.    sqlite3O
8220: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
8230: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
8240: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
8250: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
8260: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
8270: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8280: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8290: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
82a0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
82b0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
82c0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
82d0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
82e0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
82f0: 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ync = 0;.#ifdef 
8300: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
8310: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
8320: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
8330: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
8340: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
8350: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
8360: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
8370: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
8380: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
8390: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
83a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
83b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
83c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
83d0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
83e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
83f0: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
8400: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8410: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
8420: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
8430: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
8440: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8450: 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ARED;.  pPager->
8460: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
8470: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
8480: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
8490: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
84a0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
84b0: 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
84c0: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67  ->pFirst;.  pPag
84d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
84e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
84f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8500: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8510: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8520: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8530: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8540: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8550: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8560: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8570: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8580: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8590: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
85a0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
85b0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
85c0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
85d0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
85e0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
85f0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8600: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8610: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8620: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8630: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8640: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8650: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8660: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8670: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8680: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8690: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
86a0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
86b0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
86c0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
86d0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
86e0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
86f0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
8700: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8710: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8720: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8730: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8740: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8750: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8760: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8770: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8780: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8790: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
87a0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
87b0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
87c0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
87d0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
87e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
87f0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
8800: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8810: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8820: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8830: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8840: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8850: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8860: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8870: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8880: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8890: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
88a0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
88b0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
88c0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
88d0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
88e0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
88f0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
8900: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8910: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8920: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8930: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8940: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8950: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8960: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8970: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8980: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8990: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
89a0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
89b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
89c0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
89d0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
89e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
89f0: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
8a00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
8a10: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
8a20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8a30: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
8a40: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
8a50: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
8a60: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
8a70: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
8a80: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
8a90: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
8aa0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
8ab0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
8ac0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
8ad0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
8ae0: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
8af0: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
8b00: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
8b10: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
8b20: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
8b30: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
8b40: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
8b50: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
8b60: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
8b70: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
8b80: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
8bb0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
8bc0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
8c00: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
8c10: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c30: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
8c40: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
8c50: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
8c60: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
8c70: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
8c80: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
8c90: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
8ca0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
8cb0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8cc0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
8cd0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
8ce0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
8cf0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
8d00: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
8d10: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
8d20: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
8d30: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
8d40: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8d50: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
8d60: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
8d70: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8d80: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
8d90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8da0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8db0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8dc0: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
8dd0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
8de0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
8df0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8e00: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
8e10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
8e20: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
8e30: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
8e40: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
8e50: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
8e60: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
8e70: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
8e80: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
8e90: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
8ea0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
8eb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8ec0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
8ed0: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
8ee0: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
8ef0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
8f00: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
8f10: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
8f20: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
8f30: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
8f40: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
8f50: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
8f60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
8f70: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
8f80: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
8f90: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
8fa0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8fb0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
8fc0: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
8fd0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
8fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8ff0: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9000: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9010: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9020: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9030: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9040: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9050: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
9060: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
9070: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
9080: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
9090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
90a0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
90b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
90c0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
90d0: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
90e0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
90f0: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9100: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9110: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9120: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9130: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9140: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
9150: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9160: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
9170: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
9180: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
9190: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
91a0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
91b0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
91c0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
91d0: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
91e0: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
91f0: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
9200: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9210: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
9220: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
9230: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
9240: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
9250: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
9260: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
9270: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
9280: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
9290: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
92a0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
92b0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
92c0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
92d0: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
92e0: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
92f0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
9300: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
9310: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
9320: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
9330: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
9340: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
9350: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
9360: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
9370: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
9380: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
9390: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
93a0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
93b0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
93c0: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
93d0: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
93e0: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
93f0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
9400: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
9410: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
9420: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
9430: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
9440: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
9450: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
9460: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
9470: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
9480: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
9490: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
94a0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
94b0: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
94c0: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
94d0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
94e0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
94f0: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
9500: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
9510: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
9520: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
9530: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9540: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
9550: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9560: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9570: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9580: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9590: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
95a0: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
95b0: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
95c0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
95d0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
95e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
95f0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9600: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
9610: 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33  g!=0 );.  TRACE3
9620: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
9630: 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
9640: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
9650: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9660: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9670: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
9680: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
9690: 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  nc==0) ){.    rc
96a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
96b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
96c0: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
96d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
96e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
96f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9700: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9710: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
9720: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9730: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
9740: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
9750: 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
9760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9770: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
9780: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
9790: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
97a0: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
97b0: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
97c0: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
97d0: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
97e0: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
97f0: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
9800: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
9810: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
9820: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
9830: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
9840: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
9850: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
9860: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
9870: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
9880: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
9890: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
98a0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
98b0: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
98c0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
98d0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
98e0: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
98f0: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
9900: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
9910: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
9920: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
9930: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9940: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9950: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
9960: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
9970: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
9980: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
9990: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
99a0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
99b0: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
99c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
99d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
99e0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
99f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
9a00: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
9a10: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43  g);.#endif.    C
9a20: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
9a30: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
9a40: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
9a50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
9a60: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
9a70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
9a80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9a90: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
9aa0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
9ab0: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
9ac0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9ad0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
9ae0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
9af0: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
9b00: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
9b10: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
9b20: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9b30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
9b40: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
9b50: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
9b60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9b70: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
9b80: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
9b90: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
9ba0: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
9bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
9bc0: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
9bd0: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
9be0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
9bf0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
9c00: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
9c10: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
9c20: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
9c30: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
9c40: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
9c50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9c60: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
9c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
9c80: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f  ger_delmaster(co
9c90: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
9ca0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
9cb0: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
9cc0: 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d  = 0;.  OsFile *m
9cd0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  aster = 0;.  cha
9ce0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
9cf0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
9d00: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
9d10: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
9d20: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
9d30: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
9d40: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
9d50: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
9d60: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
9d70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
9d80: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
9d90: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
9da0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
9db0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
9dc0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
9dd0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
9de0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
9df0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
9e00: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
9e10: 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65  (zMaster, &maste
9e20: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
9e30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9e40: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9e50: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b  master_open = 1;
9e60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9e70: 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72  sFileSize(master
9e80: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
9e90: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
9ea0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9eb0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9ec0: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
9ed0: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
9ee0: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
9ef0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
9f00: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c  r = 0;..    /* L
9f10: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
9f20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9f30: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
9f40: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
9f50: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ** sqliteMalloc(
9f60: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
9f70: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
9f80: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
9f90: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9fa0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
9fb0: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
9fc0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
9fd0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
9fe0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9ff0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a000: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a010: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
a020: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a030: 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  d(master, zMaste
a040: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
a050: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
a060: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a070: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a080: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
a090: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
a0a0: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
a0b0: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
a0c0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
a0d0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a0e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
a0f0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75  sFileExists(zJou
a100: 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
a110: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
a120: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
a130: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
a140: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
a150: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
a160: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
a170: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
a180: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a190: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
a1a0: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
a1b0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
a1c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a1d0: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
a1e0: 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a          OsFile *
a1f0: 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  journal = 0;.   
a200: 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20       int c;..   
a210: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a220: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
a230: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e  zJournal, &journ
a240: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
a250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a260: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
a270: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a280: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
a290: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
a2a0: 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61  erJournal(journa
a2b0: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
a2c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a2d0: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
a2e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a2f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a300: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a310: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a320: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
a330: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
a340: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
a350: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
a360: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
a370: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
a380: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
a390: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
a3a0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
a3b0: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
a3c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
a3d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
a3e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
a3f0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
a400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a410: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
a420: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
a430: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
a440: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
a450: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
a460: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
a470: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
a480: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
a490: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
a4a0: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
a4b0: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
a4c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
a4d0: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
a4e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
a500: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
a510: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
a520: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
a530: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
a540: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
a550: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
a560: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
a570: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
a580: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a590: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
a5a0: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
a5b0: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
a5c0: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
a5d0: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
a5e0: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
a5f0: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
a600: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
a610: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
a620: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
a630: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
a640: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
a650: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
a660: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
a670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a680: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
a690: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
a6a0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
a6b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a6c0: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
a6d0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
a6e0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
a6f0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
a700: 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d   *zBuf = pPager-
a710: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  >pTmpSpace;     
a720: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
a730: 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20  ge for one page 
a740: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
a750: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
a760: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
a770: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
a780: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
a790: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
a7a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
a7b0: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a7c0: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70  pageSize*(i64)(p
a7d0: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
a7e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a7f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a810: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
a820: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a830: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a840: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
a850: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
a860: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
a870: 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
a880: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
a890: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
a8a0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42  ODEC1(pPager, zB
a8b0: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
a8c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a8d0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
a8e0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
a8f0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
a900: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
a910: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
a920: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
a930: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a940: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
a950: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
a960: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
a970: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a980: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
a990: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
a9b0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
a9c0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a9d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a9e0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
a9f0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
aa00: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
aa10: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
aa20: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
aa30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aa40: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
aa50: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
aa60: 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
aa70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
aa80: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
aa90: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
aaa0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
aab0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65  ndif.  }.  pPage
aac0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
aad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
aae0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
aaf0: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
ab00: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
ab10: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
ab20: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
ab30: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ab40: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
ab50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ab60: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
ab70: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
ab80: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ab90: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
aba0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
abb0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
abc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
abd0: 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a  (i64)nPage);.}..
abe0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
abf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
ac00: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
ac10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
ac20: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
ac30: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
ac40: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
ac50: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
ac60: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ac70: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
ac80: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
ac90: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
aca0: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
acb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
acc0: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
acd0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
ace0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
acf0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
ad00: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
ad10: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
ad20: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
ad30: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
ad40: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
ad50: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
ad60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
ad70: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
ad80: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
ad90: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
ada0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
adb0: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
adc0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
add0: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
ade0: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
adf0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
ae00: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
ae10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
ae20: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
ae30: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
ae40: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
ae50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
ae60: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
ae70: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ae80: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ae90: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
aea0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
aeb0: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
aec0: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
aed0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
aee0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
aef0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
af00: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
af10: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
af20: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
af30: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
af40: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
af50: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
af60: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
af70: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
af80: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
af90: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
afa0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
afb0: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
afc0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
afd0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
afe0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
aff0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
b000: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
b010: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
b020: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
b030: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
b040: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
b050: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
b060: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
b070: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
b080: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
b090: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
b0a0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
b0b0: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
b0c0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
b0d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
b0e0: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
b0f0: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
b100: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
b110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
b120: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
b130: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
b140: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
b150: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
b160: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
b170: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
b180: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
b190: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
b1a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
b1b0: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
b1c0: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
b1d0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
b1e0: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
b1f0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b200: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
b210: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
b220: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
b230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
b240: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
b250: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
b260: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
b270: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
b280: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
b290: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
b2a0: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
b2b0: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
b2c0: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
b2d0: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
b2e0: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
b2f0: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
b300: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
b310: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
b320: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
b330: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
b340: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
b350: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
b360: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
b370: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
b380: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
b390: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
b3a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
b3b0: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
b3c0: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
b3d0: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
b3e0: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
b3f0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
b400: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
b410: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
b420: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
b430: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
b440: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
b450: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
b460: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
b470: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
b480: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
b490: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
b4a0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
b4b0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
b4c0: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
b4d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
b4e0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
b4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b500: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
b510: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
b520: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
b530: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
b540: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
b550: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
b560: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
b570: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
b580: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
b590: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
b5a0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
b5b0: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
b5c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
b5d0: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
b5e0: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
b5f0: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
b600: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
b610: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
b620: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
b630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
b640: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
b650: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
b660: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b670: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b680: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b690: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b6a0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
b6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b6c0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b6d0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
b6e0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b700: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
b710: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
b720: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b750: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
b760: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
b770: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
b780: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
b790: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
b7c0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
b7d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
b7e0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
b7f0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
b800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
b810: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
b820: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b830: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
b850: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
b860: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
b870: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
b880: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b890: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
b8a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b8b0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b8c0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
b8d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b8e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
b8f0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
b900: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
b910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b920: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b930: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
b940: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
b950: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b960: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
b970: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
b980: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
b990: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
b9a0: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
b9b0: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
b9c0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
b9d0: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
b9e0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
b9f0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
ba00: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
ba10: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
ba20: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ba30: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
ba40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ba50: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
ba60: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
ba70: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
ba80: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
ba90: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
baa0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
bab0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
bac0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
bad0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
bae0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
baf0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
bb00: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
bb10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bb20: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
bb30: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
bb40: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
bb50: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
bb60: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
bb70: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
bb80: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
bb90: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
bba0: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
bbb0: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
bbc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
bbd0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
bbe0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
bbf0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
bc00: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
bc10: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
bc20: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
bc30: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
bc40: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
bc50: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
bc60: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
bc70: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
bc80: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
bc90: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
bca0: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
bcb0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
bcc0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
bcd0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
bce0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
bcf0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
bd00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bd10: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
bd20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
bd30: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
bd40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bd50: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
bd60: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bd70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
bd80: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
bd90: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
bda0: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
bdb0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
bdc0: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
bdd0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
bde0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
bdf0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
be00: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
be10: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
be20: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
be30: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
be40: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
be50: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
be60: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
be70: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
be80: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
be90: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
bea0: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
beb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bec0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
bed0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
bee0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
bef0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
bf00: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
bf10: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
bf20: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
bf30: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
bf40: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
bf50: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
bf60: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
bf70: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
bf80: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
bf90: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
bfa0: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
bfb0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
bfc0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
bfd0: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
bfe0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bff0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
c000: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
c010: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c020: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
c030: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
c040: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
c050: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
c060: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
c070: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
c080: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c090: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c0a0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
c0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
c0c0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
c0d0: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
c0e0: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
c0f0: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
c100: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c110: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
c120: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
c130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c140: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
c150: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
c160: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
c170: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
c180: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
c190: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c1a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
c1b0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
c1c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c1d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c1e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c1f0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
c200: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c210: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c220: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
c230: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
c240: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 20 6a  rollback a hot j
c250: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 65  ournal, then the
c260: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
c270: 20 20 20 20 2a 2a 20 69 73 20 70 72 6f 62 61 62      ** is probab
c280: 6c 79 20 6e 6f 74 20 72 65 63 6f 76 65 72 61 62  ly not recoverab
c290: 6c 65 2e 20 20 52 65 74 75 72 6e 20 43 4f 52 52  le.  Return CORR
c2a0: 55 50 54 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  UPT..          *
c2b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
c2c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
c2d0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c2e0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
c2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c300: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
c310: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
c320: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
c330: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
c340: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c350: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
c360: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
c370: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
c380: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
c390: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
c3a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
c3b0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
c3c0: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
c3d0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
c3e0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
c3f0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
c400: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
c410: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
c420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c430: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
c440: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
c450: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c460: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
c470: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
c480: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
c490: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
c4a0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
c4b0: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
c4c0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
c4d0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
c4e0: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
c4f0: 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54  erent PAGER_SECT
c500: 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c  OR_SIZE.  ** val
c510: 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
c520: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
c530: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
c540: 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ss..  */.  pPage
c550: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
c560: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
c570: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
c580: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c590: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
c5a0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c5b0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
c5c0: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
c5d0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
c5e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c5f0: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
c600: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
c610: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
c620: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
c630: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
c640: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
c650: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
c660: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
c670: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
c680: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
c690: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
c6a0: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
c6b0: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
c6c0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
c6d0: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
c6e0: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
c6f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
c700: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
c710: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
c720: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
c730: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
c740: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
c750: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
c760: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
c770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c780: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
c790: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
c7a0: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
c7d0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
c7e0: 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
c7f0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
c800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c810: 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
c820: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c830: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c840: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
c850: 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
c860: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c870: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
c880: 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73   .  {.    i64 os
c890: 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73  _szJ;.    rc = s
c8a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
c8b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  (pPager->jfd, &o
c8c0: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
c8d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c8e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
c8f0: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
c900: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
c910: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
c920: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
c930: 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  et just after th
c940: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
c950: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70  t journal.  ** p
c960: 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  age written befo
c970: 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  re the first jou
c980: 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20  rnal-header for 
c990: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20  this statement. 
c9a0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
c9b0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20  was written, or 
c9c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
c9d0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
c9e0: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
c9f0: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
ca00: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
ca10: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
ca20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ca30: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
ca40: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
ca50: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
ca60: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
ca70: 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20   .  /* Truncate 
ca80: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
ca90: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
caa0: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69  l size..  */.  i
cab0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
cac0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
cad0: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  E ){.    rc = pa
cae0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
caf0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
cb00: 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73  tSize);.  }.  as
cb10: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
cb20: 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
cb30: 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
cb40: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
cb50: 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  stmtSize;..  /* 
cb60: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
cb70: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
cb80: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
cb90: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
cba0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cbb0: 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50  >stmtInUse && pP
cbc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cbd0: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
cbe0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66  Seek(pPager->stf
cbf0: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
cc00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
cc10: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
cc20: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
cc30: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
cc40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
cc50: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
cc60: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
cc70: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
cc80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
cc90: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
cca0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
ccb0: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
ccc0: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
ccd0: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
cce0: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
ccf0: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
cd00: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
cd10: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
cd20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cd30: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cd40: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
cd50: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
cd60: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
cd70: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
cd80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cd90: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
cda0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cdb0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
cdc0: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
cdd0: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
cde0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
cdf0: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
ce00: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
ce10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ce20: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
ce30: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
ce40: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
ce50: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
ce60: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
ce70: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
ce80: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
ce90: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
cea0: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
ceb0: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
cec0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
ced0: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
cee0: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
cef0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
cf00: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
cf10: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
cf20: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
cf30: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
cf40: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
cf50: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
cf60: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
cf70: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
cf80: 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
cf90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cfa0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
cfb0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
cfc0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
cfd0: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
cfe0: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
cff0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
d000: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
d010: 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
d020: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d030: 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
d040: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
d050: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
d060: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
d070: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
d080: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d090: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
d0a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
d0b0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d0c0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
d0d0: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
d0e0: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
d0f0: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
d100: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d110: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
d120: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
d130: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
d140: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
d150: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
d160: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
d170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d180: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
d190: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d1a0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
d1b0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d1c0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
d1d0: 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
d1e0: 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
d1f0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
d200: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
d210: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
d220: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
d230: 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
d240: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d250: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
d260: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
d270: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d280: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d290: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d2a0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d2b0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d2c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d2d0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
d2e0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d2f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
d300: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d310: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
d320: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
d330: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
d340: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
d350: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d360: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
d370: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
d380: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
d390: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d3a0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
d3b0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
d3c0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
d3d0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
d3e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
d3f0: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
d400: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
d410: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
d420: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
d430: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d440: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
d450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d460: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
d470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
d480: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
d490: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
d4a0: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
d4b0: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
d4c0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
d4d0: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
d4e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
d4f0: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
d500: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d510: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
d520: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
d530: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
d540: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
d550: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
d560: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
d570: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
d580: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d590: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
d5a0: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
d5b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
d5c0: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
d5d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
d5e0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
d5f0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d610: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
d620: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
d630: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
d640: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d650: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
d660: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
d670: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
d680: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
d690: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
d6a0: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
d6b0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
d6c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d6e0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
d6f0: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
d700: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d710: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d720: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
d730: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d740: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
d750: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
d760: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
d770: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
d780: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d790: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
d7a0: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
d7b0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
d7c0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
d7d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d7e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
d7f0: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
d800: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
d810: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
d820: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
d830: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
d840: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
d860: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
d870: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
d880: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
d890: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
d8a0: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
d8b0: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
d8c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
d8d0: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
d8f0: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
d900: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d910: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
d920: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
d930: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
d940: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
d950: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
d960: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
d970: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
d980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d990: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
d9a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d9b0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
d9c0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
d9d0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
d9e0: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
d9f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
da00: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
da10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
da20: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
da30: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
da40: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
da50: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
da60: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
da70: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
da80: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
da90: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
daa0: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
dab0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
dac0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
dad0: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
dae0: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
daf0: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
db00: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
db10: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
db20: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
db30: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
db40: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
db50: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
db60: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
db70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
db80: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
db90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
dba0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
dbb0: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
dbc0: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
dbd0: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
dbe0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
dbf0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
dc00: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
dc10: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
dc20: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
dc30: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
dc40: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
dc50: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
dc60: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
dc70: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
dc80: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
dc90: 5f 6f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65  _opentemp(OsFile
dca0: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
dcb0: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
dcc0: 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53  ;.  char zFile[S
dcd0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
dce0: 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  IZE];..#ifdef SQ
dcf0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
dd00: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
dd10: 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
dd20: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
dd30: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
dd40: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20  #endif.  do{.   
dd50: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
dd60: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
dd70: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
dd80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
dd90: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
dda0: 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69   pFd, 1);.  }whi
ddb0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
ddc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
ddd0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
dde0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ddf0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
de00: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
de10: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
de20: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
de30: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
de40: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
de50: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
de60: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
de70: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
de80: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
de90: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
dea0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
deb0: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
dec0: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
ded0: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
dee0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
def0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
df00: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
df10: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
df20: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
df30: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
df40: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
df50: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
df60: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
df70: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
df80: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
df90: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
dfa0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dfb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
dfc0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
dfd0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
dfe0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
dff0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
e000: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
e010: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
e020: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
e030: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
e040: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e050: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
e060: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
e070: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
e080: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
e090: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
e0a0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
e0b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e0c0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
e0d0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
e0e0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
e0f0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e110: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
e120: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
e130: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
e140: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
e150: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
e160: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
e170: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
e180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
e190: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  0;.  char *zFull
e1a0: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
e1b0: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a  int nameLen;  /*
e1c0: 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f   Compiler is wro
e1d0: 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  ng. This is alwa
e1e0: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ys initialized b
e1f0: 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f  efore use */.  O
e200: 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74  sFile *fd;.  int
e210: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
e230: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
e240: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
e250: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
e260: 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
e270: 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
e280: 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
e290: 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
e2a0: 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
e2b0: 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
e2c0: 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72  LOCK)!=0;.  char
e2d0: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
e2e0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69  MPNAME_SIZE];.#i
e2f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e300: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
e310: 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
e320: 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
e330: 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
e340: 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
e350: 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
e360: 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
e370: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
e380: 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
e390: 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
e3a0: 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
e3b0: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
e3c0: 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
e3d0: 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
e3e0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e3f0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
e400: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
e410: 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
e420: 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e  t. It would be n
e430: 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20  ice to assert.  
e440: 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61  ** that ThreadDa
e450: 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e  ta.nAlloc is non
e460: 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20  -zero, but alas 
e470: 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74  this breaks test
e480: 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69   cases .  ** wri
e490: 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  tten to invoke t
e4a0: 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c  he pager directl
e4b0: 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  y..  */.  Thread
e4c0: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
e4d0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
e4f0: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
e500: 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73   If malloc() has
e510: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20   already failed 
e520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e530: 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e  MEM. Before even
e540: 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f  .  ** testing fo
e550: 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50  r this, set *ppP
e560: 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20  ager to NULL so 
e570: 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73  the caller knows
e580: 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
e590: 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65  structure was ne
e5a0: 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a  ver allocated. .
e5b0: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20    */.  *ppPager 
e5c0: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
e5d0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
e5e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e5f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e600: 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30  .  memset(&fd, 0
e610: 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a  , sizeof(fd));..
e620: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
e630: 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ger file and set
e640: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74   zFullPathname t
e650: 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f  o point at mallo
e660: 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f  c()ed .  ** memo
e670: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
e680: 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e  e complete filen
e690: 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64  ame (i.e. includ
e6a0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
e6b0: 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  y)..  */.  if( z
e6c0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
e6d0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
e6e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e6f0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
e700: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
e710: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
e720: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
e730: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
e740: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e750: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
e760: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
e770: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
e780: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e790: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e7a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e7b0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
e7c0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
e7d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e7e0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
e7f0: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
e800: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
e810: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
e820: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e830: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
e840: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
e850: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e860: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46 69  (zTemp);.    zFi
e870: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
e880: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
e890: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
e8a0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
e8b0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
e8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e8d0: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
e8e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e8f0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
e900: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
e910: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
e920: 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  same allocation,
e930: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   allocate.  ** s
e940: 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c  pace for the ful
e950: 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66  l paths of the f
e960: 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61  ile, directory a
e970: 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  nd journal .  **
e980: 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d   (Pager.zFilenam
e990: 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  e, Pager.zDirect
e9a0: 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ory and Pager.zJ
e9b0: 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20  ournal)..  */.  
e9c0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e9d0: 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e  e ){.    nameLen
e9e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e9f0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50  athname);.    pP
ea00: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
ea10: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
ea20: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
ea30: 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69 66 28   + 30 );.    if(
ea40: 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
ea50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea60: 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
ea70: 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ace = (char *)sq
ea80: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53 51  liteMallocRaw(SQ
ea90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
eaa0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
eab0: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   }...  /* If an 
eac0: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
ead0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
eae0: 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
eaf0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20  e the memory .  
eb00: 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
eb10: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   zFullPathname, 
eb20: 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  free the Pager s
eb30: 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
eb40: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c  se the .  ** fil
eb50: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  e. Since the pag
eb60: 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
eb70: 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
eb80: 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
eb90: 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
eba0: 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
ebb0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
ebc0: 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e  r || !zFullPathn
ebd0: 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ame || !pPager->
ebe0: 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72 63 21  pTmpSpace || rc!
ebf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ec00: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
ec10: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
ec20: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
ec30: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ec40: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
ec50: 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
ec60: 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
ec70: 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
ec80: 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20  .  TRACE3("OPEN 
ec90: 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
eca0: 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c  NDLEID(fd), zFul
ecb0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f  lPathname);.  IO
ecc0: 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
ecd0: 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a  %s\n", pPager, z
ece0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20  FullPathname)). 
ecf0: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
ed00: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
ed10: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
ed20: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
ed30: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
ed40: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
ed50: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
ed60: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
ed70: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
ed80: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
ed90: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
eda0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
edb0: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
edc0: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
edd0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66  lPathname);..  f
ede0: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
edf0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
ee00: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
ee10: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
ee20: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
ee30: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
ee40: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
ee50: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
ee60: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ee70: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
ee80: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
ee90: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
eea0: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
eeb0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
eec0: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
eed0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
eee0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
eef0: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
ef00: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
ef10: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
ef20: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
ef30: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
ef40: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
ef50: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
ef60: 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
ef70: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
ef80: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
ef90: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
efa0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
efb0: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
efc0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
efd0: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
efe0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
eff0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
f000: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f010: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
f020: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
f030: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
f040: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f050: 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30  er->nMaxPage = 0
f060: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
f070: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61  xPage = 100;.  a
f080: 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c  ssert( PAGER_UNL
f090: 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70  OCK==0 );.  /* p
f0a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
f0b0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
f0c0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
f0d0: 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
f0e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
f0f0: 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  = tempFile;.  pP
f100: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
f110: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
f120: 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
f130: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
f140: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
f150: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
f160: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
f170: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
f180: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
f190: 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
f1a0: 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
f1b0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
f1c0: 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
f1d0: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
f1e0: 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
f1f0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
f200: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
f210: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
f220: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
f230: 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66  tra);.  assert(f
f240: 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28  d||memDb);.  if(
f250: 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70   !memDb ){.    p
f260: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f270: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
f280: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d  torSize(fd);.  }
f290: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
f2a0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
f2b0: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
f2c0: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
f2d0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
f2e0: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
f2f0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
f300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f310: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
f320: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
f330: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
f340: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
f350: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
f360: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
f370: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f380: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
f390: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
f3a0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
f3b0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
f3c0: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
f3d0: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
f3e0: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
f3f0: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
f400: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
f410: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
f420: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
f430: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
f440: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
f450: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
f460: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
f470: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
f480: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
f490: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
f4a0: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
f4b0: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
f4c0: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
f4d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
f4e0: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
f4f0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
f500: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
f510: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
f520: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
f530: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
f540: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
f550: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
f560: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
f570: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
f580: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
f590: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f5a0: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
f5b0: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
f5c0: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
f5d0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
f5e0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
f5f0: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
f600: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f610: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
f620: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
f630: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f640: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
f650: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
f660: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
f670: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
f680: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
f690: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
f6a0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
f6b0: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
f6c0: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
f6d0: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
f6e0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
f6f0: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
f700: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
f710: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
f720: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
f730: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f740: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
f750: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
f760: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
f770: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
f780: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f790: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
f7a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f7b0: 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
f7c0: 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
f7d0: 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
f7e0: 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
f7f0: 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
f800: 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
f810: 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
f820: 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
f830: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
f840: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
f850: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
f860: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f870: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
f880: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
f890: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
f8a0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
f8b0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
f8c0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
f8d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
f8e0: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
f8f0: 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ze;.    sqlite3R
f900: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
f910: 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 70  id **)&pPager->p
f920: 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53 69  TmpSpace, pageSi
f930: 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
f940: 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
f950: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ze;.}../*.** The
f960: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
f970: 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
f980: 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
f990: 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
f9a0: 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
f9b0: 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
f9c0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f9d0: 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
f9e0: 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
f9f0: 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
fa00: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
fa10: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
fa20: 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
fa30: 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
fa40: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
fa50: 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
fa60: 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
fa70: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
fa80: 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
fa90: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
faa0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
fab0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
fac0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
fad0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
fae0: 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61  d_cnt;.void clea
faf0: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
fb00: 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65  rror(){.  sqlite
fb10: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d  3_io_error_hit =
fb20: 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62   0;.}.void disab
fb30: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
fb40: 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
fb50: 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
fb60: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
fb70: 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
fb80: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
fb90: 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
fba0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
fbb0: 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
fbc0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
fbd0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
fbe0: 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
fbf0: 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73  # define clear_s
fc00: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fc10: 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73  r().# define dis
fc20: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
fc30: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
fc40: 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
fc50: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
fc60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
fc70: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
fc80: 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
fc90: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
fca0: 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
fcb0: 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
fcc0: 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
fcd0: 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
fce0: 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
fcf0: 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
fd00: 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
fd10: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
fd20: 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
fd30: 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
fd40: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
fd50: 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
fd60: 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
fd70: 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
fd80: 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
fd90: 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
fda0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
fdb0: 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
fdc0: 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
fdd0: 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
fde0: 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
fdf0: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
fe00: 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
fe10: 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
fe20: 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
fe30: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
fe40: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
fe50: 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65  3pager_read_file
fe60: 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
fe70: 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
fe80: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
fe90: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
fea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
feb0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
fec0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
fed0: 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  ){.    disable_s
fee0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fef0: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
ff00: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
ff10: 66 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62  fd, 0);.    enab
ff20: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
ff30: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f  errors();.    IO
ff40: 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
ff50: 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
ff60: 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
ff70: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
ff80: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
ff90: 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  N);.    if( rc==
ffa0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
ffb0: 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
ffc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ffd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ffe0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fff0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
10000 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
10010 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
10020 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10030 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
10040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
10050 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
10060 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
10070 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
10080 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
10090 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
100a0 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
100b0 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
100c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
100d0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
100e0 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
100f0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
10100 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
10110 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
10120 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
10130 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
10140 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
10150 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10160 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
10170 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
10180 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  4 n;.  int rc;. 
10190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
101a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
101b0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
101c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
101d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
101e0 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
101f0 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
10200 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
10210 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
10220 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
10230 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
10240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10250 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
10260 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
10270 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10280 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
10290 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
102a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
102b0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
102c0 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
102d0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
102e0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
102f0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
10300 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
10310 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10320 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
10330 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
10340 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
10350 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
10360 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
10370 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  n;.}...#ifndef S
10380 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
10390 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  YDB./*.** Clear 
103a0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
103b0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
103c0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
103d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
103e0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
103f0 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
10400 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
10410 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
10420 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
10430 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
10440 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
10450 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
10460 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
10470 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
10480 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
10490 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
104a0 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
104b0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
104c0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
104d0 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
104e0 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
104f0 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
10500 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
10510 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
10520 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
10530 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
10540 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
10550 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20  ager_movepage() 
10560 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76  routine can leav
10570 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  e a page in the 
10580 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50  .** pNextFree/pP
10590 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61  revFree list tha
105a0 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20  t is not a part 
105b0 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69  of any hash-chai
105c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
105d0 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69  d unlinkHashChai
105e0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
105f0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
10600 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30  if( pPg->pgno==0
10610 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10620 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d  pPg->pNextHash==
10630 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48  0 && pPg->pPrevH
10640 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ash==0 );.    re
10650 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
10660 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
10670 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
10680 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
10690 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
106a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
106b0 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
106c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
106d0 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e  ->aHash[pPg->pgn
106e0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
106f0 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20  sh-1)]!=pPg );. 
10700 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
10710 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
10720 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
10730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
10740 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20  h = pPg->pgno & 
10750 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10760 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
10770 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
10780 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
10790 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
107a0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
107b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
107c0 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20   pPager));.  }. 
107d0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
107e0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
107f0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
10800 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h = 0;.}../*.** 
10810 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
10820 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
10830 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
10840 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
10850 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
10860 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
10870 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
10880 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10890 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
108a0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
108b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
108c0 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
108d0 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
108e0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
108f0 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
10900 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
10910 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
10920 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10930 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
10940 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
10950 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
10960 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
10970 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
10980 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
10990 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
109a0 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
109b0 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
109c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
109d0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
109e0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
109f0 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
10a00 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10a10 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
10a20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10a30 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
10a40 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
10a50 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
10a60 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
10a70 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
10a80 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
10a90 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
10aa0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
10ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
10ac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
10ad0 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
10ae0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
10af0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
10b00 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
10b10 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
10b20 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
10b30 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
10b40 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
10b50 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
10b60 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
10b70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
10b80 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
10b90 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  DB./*.** This ro
10ba0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
10bb0 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
10bc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
10bd0 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
10be0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
10bf0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
10c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
10c10 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
10c20 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
10c30 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
10c40 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10c50 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
10c60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
10c70 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
10c80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
10c90 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
10ca0 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
10cb0 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
10cc0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
10cd0 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
10ce0 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
10cf0 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
10d00 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
10d10 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
10d20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
10d30 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
10d40 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
10d50 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
10d60 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
10d70 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
10d80 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
10d90 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
10da0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
10db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
10dc0 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
10dd0 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
10de0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
10df0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
10e10 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
10e20 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
10e30 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
10e40 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72  #define memoryTr
10e50 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66  uncate(p).#endif
10e60 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
10e70 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
10e80 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
10e90 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
10ea0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
10eb0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
10ec0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
10ed0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
10ee0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
10ef0 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
10f00 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
10f10 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
10f20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10f30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
10f40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10f50 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
10f60 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
10f70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
10f80 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
10f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10fa0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
10fb0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
10fc0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
10fd0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
10fe0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
10ff0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
11000 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
11010 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
11020 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
11030 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
11040 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
11050 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
11060 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
11070 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
11080 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
11090 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
110a0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
110b0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
110c0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
110d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
110e0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
110f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
11100 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
11110 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
11120 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
11130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
11150 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
11160 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
11170 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
11180 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
11190 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
111a0 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
111b0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
111c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
111d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
111e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
111f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
11200 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
11210 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
11220 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
11230 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
11240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11250 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11260 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
11270 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
11280 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
11290 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
112a0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
112c0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
112d0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
112e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
112f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
11300 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
11310 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
11320 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
11330 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11340 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
11350 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
11360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11370 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
11380 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
11390 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
113a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
113b0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
113c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
113d0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
113e0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
113f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11410 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63  .  }.  rc = sync
11420 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
11430 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
11450 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
11460 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
11470 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
11480 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
11490 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72  uncating. */.  r
114a0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
114b0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
114c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
114d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
114e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
114f0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
11500 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
11510 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
11520 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
11540 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
11550 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
11560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
11570 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
11580 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
11590 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
115a0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
115b0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
115c0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
115d0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
115e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
115f0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
11600 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
11610 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
11620 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
11630 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
11640 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
11650 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
11660 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
11670 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
11680 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
11690 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
116a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
116b0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
116c0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
116d0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
116e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
116f0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
11700 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11710 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
11720 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
11730 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
11740 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11750 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
11760 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
11770 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
11780 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
11790 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
117a0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
117b0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
117c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
117d0 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65  pager_close(Page
117e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
117f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11800 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11810 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
11820 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
11830 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
11840 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
11850 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
11860 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
11870 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
11880 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
11890 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
118a0 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
118b0 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
118c0 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
118d0 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
118e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
118f0 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
11900 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
11910 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
11920 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
11930 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
11940 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
11950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
11970 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c  sd && pTsd->nAll
11980 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  oc );.#endif..  
11990 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
119a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
119b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
119c0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
119d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 65  set(pPager);.  e
119e0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
119f0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 54  io_errors();.  T
11a00 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
11a10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11a20 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
11a30 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
11a40 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
11a50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
11a60 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
11a70 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
11a80 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11a90 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
11aa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11ab0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11ac0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11ad0 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
11ae0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
11af0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
11b00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
11b10 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
11b20 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
11b30 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
11b40 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
11b50 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
11b60 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
11b70 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11b80 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
11b90 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
11ba0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
11bb0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
11bc0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
11bd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
11be0 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
11bf0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
11c00 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
11c10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
11c20 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
11c30 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
11c40 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
11c50 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
11c60 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
11c70 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
11c80 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
11c90 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
11ca0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
11cb0 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
11cc0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
11cd0 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
11ce0 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
11cf0 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
11d00 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
11d10 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
11d20 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
11d30 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
11d40 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
11d50 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11d60 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
11d70 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
11d80 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
11d90 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ace);.  sqliteFr
11da0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
11db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11dd0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
11de0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
11df0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
11e00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
11e10 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
11e20 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11e30 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
11e40 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
11e50 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
11e60 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
11e70 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
11e80 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
11e90 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
11ea0 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
11eb0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
11ec0 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
11ed0 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
11ee0 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
11ef0 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
11f00 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
11f10 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
11f20 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
11f30 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
11f40 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
11f50 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
11f60 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
11f70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
11f80 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
11f90 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
11fa0 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
11fb0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
11fc0 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
11fd0 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
11fe0 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
11ff0 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
12000 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
12010 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
12020 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
12030 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
12040 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
12050 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
12060 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
12070 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
12080 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
12090 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
120a0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
120b0 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
120c0 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
120d0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
120e0 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
120f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12100 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
12110 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
12120 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
12130 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
12140 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
12150 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
12160 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12170 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
12180 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
121a0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
121b0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
121c0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
121d0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
121e0 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
121f0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
12200 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
12210 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
12220 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12230 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
12240 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
12250 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
12260 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12270 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
12280 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
12290 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
122a0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
122b0 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
122c0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
122d0 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
122e0 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
122f0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
12300 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
12310 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
12320 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
12330 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
12340 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
12350 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
12360 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
12370 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
12380 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
12390 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
123a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
123b0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
123c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
123d0 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
123e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
123f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
12400 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
12410 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
12420 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12430 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
12440 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
12450 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
12460 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
12470 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
12480 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
12490 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
124a0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
124b0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
124c0 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
124d0 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
124e0 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
124f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
12500 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
12510 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
12520 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
12530 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12540 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
12550 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
12560 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
12570 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
12580 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
12590 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
125a0 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
125b0 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
125c0 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
125d0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
125e0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
125f0 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
12600 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
12610 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
12620 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
12630 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
12640 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
12650 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
12660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
12670 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
12680 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
12690 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
126a0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
126b0 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
126c0 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
126d0 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
126e0 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
126f0 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
12700 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
12710 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
12720 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
12730 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
12740 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
12750 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
12760 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
12770 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
12780 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
12790 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
127a0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
127b0 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
127c0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
127d0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
127e0 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
127f0 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
12800 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
12810 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
12820 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
12830 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
12840 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
12850 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12860 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
12870 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
12880 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
12890 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
128a0 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
128b0 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
128c0 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
128d0 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
128e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
128f0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
12900 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
12910 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
12920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12930 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
12940 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
12950 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
12960 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
12970 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
12980 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
12990 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
129a0 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
129b0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
129c0 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
129d0 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
129e0 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
129f0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
12a00 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
12a10 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
12a20 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
12a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
12a40 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
12a50 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
12a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12a70 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
12a80 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
12a90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
12aa0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
12ab0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
12ac0 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
12ad0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
12ae0 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
12af0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
12b00 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
12b10 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12b20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
12b30 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
12b40 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
12b50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
12b60 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
12b70 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
12b80 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
12b90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
12ba0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
12bb0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
12bc0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
12bd0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
12be0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
12bf0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
12c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
12c10 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
12c20 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20  r rollback. .   
12c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12c40 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
12c50 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
12c60 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
12c70 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
12c80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
12c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
12ca0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
12cb0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
12cc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12cd0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
12ce0 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
12cf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
12d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
12d20 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
12d30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  (pPager->jfd,.  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
12d60 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
12d70 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
12d80 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ic));.        if
12d90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12da0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
12db0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
12dc0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a   %d\n", pPager,.
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12df0 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
12e00 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29  ournalMagic), 4)
12e10 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ).        rc = w
12e20 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
12e30 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12e40 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
12e50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12e60 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
12e70 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
12e80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12e90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
12ea0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
12eb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12ec0 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
12ed0 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
12ee0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
12ef0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
12f00 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
12f10 43 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %d\n", pPager)
12f20 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
12f30 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
12f40 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12f50 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20  full_fsync);.   
12f60 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
12f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12f80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
12f90 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
12fa0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
12fb0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
12fc0 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
12fd0 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
12fe0 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
12ff0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
13000 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13010 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13020 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
13030 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13040 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13050 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
13060 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13070 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
13080 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
13090 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
130a0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
130b0 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
130c0 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
130d0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
130e0 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
130f0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
13100 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
13110 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
13120 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
13130 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
13140 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
13150 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
13160 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13170 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13180 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13190 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
131a0 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
131b0 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
131c0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
131d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
131e0 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67  two lists of pag
131f0 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  es connected by 
13200 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67  pDirty and in pg
13210 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20  no order..** Do 
13220 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20  not both fixing 
13230 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  the pPrevDirty p
13240 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
13250 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f  ic PgHdr *merge_
13260 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13270 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a  pA, PgHdr *pB){.
13280 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20    PgHdr result, 
13290 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
132a0 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69  = &result;.  whi
132b0 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a  le( pA && pB ){.
132c0 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f      if( pA->pgno
132d0 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  <pB->pgno ){.   
132e0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
132f0 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61   = pA;.      pTa
13300 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  il = pA;.      p
13310 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a  A = pA->pDirty;.
13320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13330 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13340 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pB;.      pTail
13350 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20   = pB;.      pB 
13360 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pB->pDirty;.  
13370 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41    }.  }.  if( pA
13380 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
13390 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65  Dirty = pA;.  }e
133a0 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20  lse if( pB ){.  
133b0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
133c0 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = pB;.  }else{. 
133d0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
133e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
133f0 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79  rn result.pDirty
13400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20  ;.}../*.** Sort 
13410 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
13420 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
13430 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50  rder by pgno.  P
13440 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e  ages are.** conn
13450 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13460 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70  pointers.  The p
13470 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13480 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70  rs are.** corrup
13490 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74  ted by this sort
134a0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53  ..*/.#define N_S
134b0 4f 52 54 5f 42 55 43 4b 45 54 20 32 35 0a 73 74  ORT_BUCKET 25.st
134c0 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
134d0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
134e0 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
134f0 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d  a[N_SORT_BUCKET]
13500 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
13510 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
13520 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
13530 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
13540 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
13550 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
13560 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
13570 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
13580 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
13590 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
135a0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
135b0 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
135c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
135d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
135e0 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
135f0 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
13600 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
13610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13620 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
13630 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
13640 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
13650 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
13660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
13670 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
13680 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
13690 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
136a0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
136b0 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
136c0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
136d0 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
136e0 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
136f0 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
13700 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
13710 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
13720 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
13730 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
13740 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
13750 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
13760 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
13770 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
13780 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
13790 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
137a0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
137b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
137c0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
137d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
137e0 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
137f0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
13800 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
13810 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
13820 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
13830 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
13840 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
13850 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
13860 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
13870 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
13880 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
13890 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
138a0 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d  OsLock() are no-
138b0 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ops..  **.  ** M
138c0 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
138d0 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
138e0 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
138f0 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
13900 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
13910 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
13920 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
13930 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
13940 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
13950 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
13960 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
13970 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
13980 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
13990 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
139a0 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
139b0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
139c0 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
139d0 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
139e0 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
139f0 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
13a00 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
13a10 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
13a20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
13a30 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
13a40 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
13a50 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13a60 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
13a70 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
13a80 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
13a90 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
13aa0 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
13ab0 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
13ac0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13ad0 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
13ae0 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
13af0 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
13b00 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
13b10 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
13b20 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
13b30 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
13b40 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
13b50 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
13b60 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
13b70 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
13b80 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
13b90 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
13ba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
13bc0 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20  c;.  }..  pList 
13bd0 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28  = sort_pagelist(
13be0 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28  pList);.  while(
13bf0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73   pList ){.    as
13c00 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72  sert( pList->dir
13c10 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ty );.    rc = s
13c20 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
13c30 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d  ger->fd, (pList-
13c40 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
13c50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13c60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
13c70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20  turn rc;.    /* 
13c80 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
13c90 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
13ca0 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
13cb0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
13cc0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
13cd0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
13ce0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
13cf0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
13d00 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
13d10 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
13d20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
13d30 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
13d40 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
13d50 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
13d60 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
13d70 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
13d80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
13d90 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
13da0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
13db0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
13dc0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
13dd0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
13de0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
13df0 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41  o, 6);.      TRA
13e00 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
13e10 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
13e20 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
13e30 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49  ->pgno);.      I
13e40 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
13e50 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
13e60 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20   pList->pgno)). 
13e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
13e90 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
13ea0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
13eb0 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70       TEST_INCR(p
13ec0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
13ed0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
13ee0 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
13ef0 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53       TRACE3("NOS
13f00 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
13f10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13f20 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
13f30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
13f40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13f50 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
13f60 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  t->dirty = 0;.#i
13f70 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
13f80 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
13f90 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
13fa0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
13fb0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
13fc0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
13fd0 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
13fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
14000 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
14010 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
14020 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
14030 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14040 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
14050 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
14060 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
14070 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
14080 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
14090 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
140a0 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
140b0 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
140c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
140d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
140e0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
140f0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72  urn TRUE if ther
14100 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
14110 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  al on the given 
14120 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20  pager..** A hot 
14130 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
14140 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
14150 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  played back..**.
14160 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
14170 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
14180 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
14190 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
141a0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
141b0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
141c0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
141d0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
141e0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
141f0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
14200 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65  name.  Just dele
14210 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
14220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
14230 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
14240 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14250 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
14260 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
14270 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
14280 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
14290 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29  ger->zJournal) )
142a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
142b0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
142c0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
142d0 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e  er->fd) ) return
142e0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
142f0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
14300 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
14310 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
14320 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
14330 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
14340 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14350 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
14360 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
14370 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
14380 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
14390 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
143a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
143b0 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
143c0 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
143d0 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
143e0 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
143f0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
14400 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72  ger->errCode var
14410 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
14420 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
14430 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
14440 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67  , int syncOk, Pg
14450 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
14460 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
14470 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  Pg = 0;..  /* Fi
14480 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
14490 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
144a0 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
144b0 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
144c0 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
144d0 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
144e0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
144f0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
14500 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
14510 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
14520 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
14530 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
14540 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
14550 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75  .  ** on the jou
14560 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
14570 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
14580 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
14590 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77  a.  ** very slow
145a0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
145b0 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
145c0 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
145d0 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20  metimes.  ** it 
145e0 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
145f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  .  */.  if( pPg=
14600 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
14610 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26  irst && syncOk &
14620 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69  & !MEMDB){.    i
14630 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
14640 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
14650 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
14660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
14680 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
14690 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
146a0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
146b0 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
146c0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
146d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
146e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
146f0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
14700 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
14710 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
14720 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
14730 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
14740 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
14750 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
14760 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
14770 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
14780 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
14790 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
147a0 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
147b0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
147c0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
147d0 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
147e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
147f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
14800 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14810 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
14820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14830 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
14840 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
14850 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
14860 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
14870 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
14880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
148a0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
148b0 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
148c0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
148d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
148e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
148f0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
14900 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
14910 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
14920 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
14930 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
14940 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
14950 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
14960 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
14970 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
14980 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
14990 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
149a0 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
149b0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
149c0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
149d0 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
149e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
149f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14a10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14a20 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
14a30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
14a40 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
14a50 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
14a60 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
14a70 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
14a80 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
14a90 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
14aa0 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
14ab0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e  .  ** sqlite_don
14ac0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  t_rollback() opt
14ad0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
14ae0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
14af0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
14b00 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
14b10 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61   to do this beca
14b20 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72  use the page mar
14b30 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
14b40 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ck.  ** might be
14b50 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
14b60 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
14b70 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
14b80 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
14b90 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
14ba0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
14bb0 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
14bc0 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
14bd0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61   must.  ** be ma
14be0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
14bf0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
14c00 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20   on out..  */.  
14c10 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
14c20 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49  ollback ){.    I
14c30 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f  OTRACE(("ALWAYS_
14c40 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20  ROLLBACK %p\n", 
14c50 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61  pPager)).    pPa
14c60 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
14c70 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
14c80 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
14c90 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
14ca0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
14cb0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
14cc0 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
14cd0 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52  Pg);.  TEST_INCR
14ce0 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b  (pPager->nOvfl);
14cf0 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
14d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14d30 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
14d40 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
14d50 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
14d60 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
14d70 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
14d80 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
14d90 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
14da0 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
14db0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
14dc0 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
14dd0 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
14de0 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
14df0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14e00 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
14e10 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
14e20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
14e30 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
14e40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
14e50 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
14e60 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
14e70 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
14e80 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
14e90 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
14ea0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
14eb0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
14ec0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14ed0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
14ee0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14ef0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
14f00 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  MENT.int sqlite3
14f10 70 61 67 65 72 5f 72 65 6c 65 61 73 65 5f 6d 65  pager_release_me
14f20 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
14f30 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
14f40 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c  ta *pTsdro = sql
14f50 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
14f60 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65  adOnly();.  Page
14f70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c  r *p;.  int nRel
14f80 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  eased = 0;.  int
14f90 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   i;..  /* If the
14fa0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
14fb0 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20  x is held, this 
14fc0 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d  subroutine becom
14fd0 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20  es a.  ** o-op; 
14fe0 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65  zero bytes of me
14ff0 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e 20  mory are freed. 
15000 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
15010 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  .  ** some of th
15020 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62  e code invoked b
15030 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
15040 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72  may also.  ** tr
15050 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  y to obtain the 
15060 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67  mutex, resulting
15070 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a   in a deadlock..
15080 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
15090 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29  e3OsInMutex(0) )
150a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
150b0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d    }..  /* Outerm
150c0 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f  ost loop runs fo
150d0 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74  r at most two it
150e0 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20  erations. First 
150f0 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a  iteration we.  *
15100 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65  * try to find me
15110 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  mory that can be
15120 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75   released withou
15130 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  t calling fsync(
15140 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69  ). Second.  ** i
15150 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20  teration (which 
15160 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65  only runs if the
15170 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f   first failed to
15180 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73   free nReq bytes
15190 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29   of.  ** memory)
151a0 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
151b0 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54   call fsync(). T
151c0 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65  his is of course
151d0 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a   much more .  **
151e0 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f   expensive..  */
151f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31  .  for(i=0; i<=1
15200 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
15210 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
15220 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65   the SQLite page
15230 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
15240 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
15250 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54   */.    for(p=pT
15260 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20  sdro->pPager; p 
15270 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
15280 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
15290 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
152a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
152b0 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
152c0 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70     /* For each p
152d0 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65  ager, try to fre
152e0 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20  e as many pages 
152f0 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74  as possible (wit
15300 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63  hout .      ** c
15310 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69  alling fsync() i
15320 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
15330 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
15340 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a   the outermost .
15350 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a        ** loop)..
15360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77        */.      w
15370 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
15380 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63  =(rc = pager_rec
15390 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67 29  ycle(p, i, &pPg)
153a0 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20  ) && pPg) {.    
153b0 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
153c0 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
153d0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
153e0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
153f0 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  en .        ** r
15400 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
15410 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
15420 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
15430 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
15440 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
15450 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
15460 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
15470 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
15480 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d   .        ** Rem
15490 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
154a0 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
154b0 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  eing..        **
154c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f  .        ** Todo
154d0 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65  : Check the Page
154e0 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20  r.pStmt list to 
154f0 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
15500 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20  s Ok. It .      
15510 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73    ** probably is
15520 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20   though..       
15530 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64   */.        PgHd
15540 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20  r *pTmp;.       
15550 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
15560 20 20 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d          page_rem
15570 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
15580 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
15590 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c   if( pPg==p->pAl
155a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
155b0 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  p->pAll = pPg->p
155c0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
155d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
155e0 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70    for( pTmp=p->p
155f0 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  All; pTmp->pNext
15600 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70  All!=pPg; pTmp=p
15610 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
15620 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70  }.          pTmp
15630 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
15640 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
15650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52      }.        nR
15660 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74  eleased += sqlit
15670 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b  eAllocSize(pPg);
15680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
15690 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
156a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
156b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
156c0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
156d0 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
156e0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
156f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
15700 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75   .        ** jou
15710 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
15720 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
15730 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
15740 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
15750 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20     ** caller of 
15760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15770 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20  nstead, set the 
15780 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
15790 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  riable..        
157a0 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c  ** The error wil
157b0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
157c0 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73   the user (or us
157d0 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65  ers, in the case
157e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20   .        ** of 
157f0 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63  a shared pager c
15800 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67  ache) of the pag
15810 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
15820 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a   error occured..
15830 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15840 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26 30     assert( (rc&0
15850 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
15860 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  RR || rc==SQLITE
15870 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  _FULL );.       
15880 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
15890 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
158a0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
158b0 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b  er_error(p, rc);
158c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
158d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   }..  return nRe
158e0 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
158f0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15900 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
15910 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63  ENT */../*.** Ac
15920 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
15930 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
15940 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15950 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
15960 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
15970 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
15980 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
15990 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
159a0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
159b0 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
159c0 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
159d0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
159e0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
159f0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
15a00 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
15a10 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
15a20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
15a30 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
15a40 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
15a50 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
15a60 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
15a70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
15a80 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
15a90 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
15aa0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
15ab0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
15ac0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
15ad0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
15ae0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
15af0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
15b00 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
15b10 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
15b20 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
15b30 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
15b40 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
15b50 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
15b60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
15b70 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
15b80 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
15b90 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
15ba0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
15bb0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
15bc0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
15bd0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
15be0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
15bf0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
15c00 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
15c10 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
15c20 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
15c30 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
15c40 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
15c50 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
15c60 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
15c70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
15c80 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
15c90 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
15ca0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
15cb0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
15cc0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
15cd0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
15ce0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
15cf0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
15d00 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
15d10 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
15d20 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
15d30 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
15d40 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
15d50 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
15d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c  ..**.** If clrFl
15d70 61 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  ag is false, the
15d80 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
15d90 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
15da0 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
15db0 66 20 63 6c 66 46 6c 61 67 20 69 73 20 74 72 75  f clfFlag is tru
15dc0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
15dd0 70 61 67 65 20 69 73 20 61 62 6f 75 74 20 74 6f  page is about to
15de0 20 62 65 20 65 72 61 73 65 64 20 61 6e 64 0a 2a   be erased and.*
15df0 2a 20 72 65 77 72 69 74 74 65 6e 20 77 69 74 68  * rewritten with
15e00 6f 75 74 20 66 69 72 73 74 20 62 65 69 6e 67 20  out first being 
15e10 72 65 61 64 20 73 6f 20 74 68 65 72 65 20 69 73  read so there is
15e20 20 6e 6f 20 70 6f 69 6e 74 20 69 74 20 64 6f 69   no point it doi
15e30 6e 67 0a 2a 2a 20 74 68 65 20 64 69 73 6b 20 49  ng.** the disk I
15e40 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  /O..*/.int sqlit
15e50 65 33 70 61 67 65 72 5f 61 63 71 75 69 72 65 28  e3pager_acquire(
15e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
15e70 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
15e80 2a 70 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72  *ppPage, int clr
15e90 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  Flag){.  PgHdr *
15ea0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
15eb0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
15ec0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
15ed0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
15ee0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
15ef0 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
15f00 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
15f10 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
15f20 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
15f30 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
15f40 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
15f50 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15f60 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15f70 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
15f80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15f90 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
15fa0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
15fb0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
15fc0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
15fd0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
15fe0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
15ff0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
16000 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
16010 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
16020 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
16030 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
16040 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
16060 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
16070 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
16080 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
16090 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
160a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
160b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
160c0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
160d0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
160e0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
160f0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
16100 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16110 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
16120 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
16130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16150 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16160 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
16180 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
16190 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
161a0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
161b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
161c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
161d0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
161e0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
161f0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16200 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
16220 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
16230 72 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20  r) ){.       /* 
16240 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
16250 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16260 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
16270 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
16280 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
16290 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
162a0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
162b0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
162c0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
162d0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
162e0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
162f0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
16300 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
16310 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16320 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
16330 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
16340 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
16350 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
16360 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
16370 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
16380 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
16390 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
163a0 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
163b0 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
163c0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
163d0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
163e0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
163f0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
16400 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
16410 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
16420 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
16430 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
16440 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
16450 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
16460 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
16470 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16480 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
16490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
164a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
164b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
164c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
164d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
164e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
164f0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
16500 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16510 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16520 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16530 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
16540 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16550 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16560 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
16570 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16580 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
16590 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
165a0 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
165b0 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
165c0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
165d0 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
165e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
165f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16600 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
16610 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
16620 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
16630 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
16640 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
16650 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
16660 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
16670 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
16680 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
16690 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
166a0 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
166b0 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
166c0 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
166d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
166e0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
166f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16700 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
16710 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
16720 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
16730 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
16740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16760 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
16770 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
16790 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  SY;.       }.   
167a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
167b0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
167c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
167d0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
167e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
167f0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
16800 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
16810 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
16820 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16830 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20  nalHdr = 0;..   
16840 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
16850 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
16860 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
16870 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
16880 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  .       ** lock 
16890 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
168a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
168b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
168c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
168d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
168e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
168f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16900 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16910 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
16930 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16940 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
16950 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
16960 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
16970 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16980 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
16990 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
169a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
169b0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
169c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
169d0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
169e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
169f0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
16a00 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
16a10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16a20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
16a30 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
16a40 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
16a50 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
16a60 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
16a70 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
16a80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
16a90 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c  st==0 || MEMDB |
16aa0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
16ab0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
16ac0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f  =0 && pPager->do
16ad0 4e 6f 74 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a  NotSync).    ){.
16ae0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
16af0 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
16b00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16b10 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
16b20 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
16b30 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
16b40 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
16b50 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16b60 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
16b70 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
16b80 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69  sh*2);.        i
16b90 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
16ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16bc0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
16be0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
16bf0 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
16c00 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
16c10 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
16c40 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
16c50 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
16c80 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
16c90 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
16ca0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
16cd0 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
16ce0 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
16cf0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16d00 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
16d10 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16d20 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
16d30 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
16d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16d50 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
16d60 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
16d70 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
16d80 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
16d90 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
16da0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16db0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
16dc0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
16dd0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
16de0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16df0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
16e00 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
16e10 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
16e20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
16e30 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
16e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e50 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
16e60 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  le(pPager, 1, &p
16e70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
16e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16ea0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16eb0 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20   assert(pPg) ;. 
16ec0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
16ed0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
16ee0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
16ef0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
16f00 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
16f10 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
16f20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
16f30 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
16f40 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
16f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16f60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16f70 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
16f80 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
16f90 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
16fa0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
16fb0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
16fc0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16fd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16fe0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
16ff0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
17000 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
17010 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
17020 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
17030 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
17040 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
17050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
17060 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
17070 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
17080 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
17090 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
170a0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
170b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
170c0 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
170d0 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
170e0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  Pg);.    }.    m
170f0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
17100 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
17110 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
17120 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
17130 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
17140 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
17150 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
17160 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
17170 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
17180 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
17190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
171a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
171b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
171c0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
171d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
171e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
171f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17210 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
17220 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
17230 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
17240 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
17250 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
17260 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
17270 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
17280 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
17290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
172a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
172b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
172c0 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
172d0 44 42 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  DB.         || (
172e0 63 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67  clrFlag && !pPag
172f0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
17300 63 6b 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ck) .    ){.    
17310 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17320 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
17330 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17340 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17350 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44      assert( MEMD
17360 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  B==0 );.      rc
17370 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
17380 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
17390 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
173a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
173b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
173c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
173d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
173e0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
173f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
17400 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17430 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17440 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49     IOTRACE(("PGI
17450 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
17460 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20  er, pgno)).     
17470 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25   TRACE3("FETCH %
17480 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17490 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
174a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
174b0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
174c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
174d0 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
174e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
174f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
17500 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
17510 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
17520 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
17530 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
17540 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
17550 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17560 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
17570 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  rn rc;.      }el
17580 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54  se{.        TEST
17590 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
175a0 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ead);.      }.  
175b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
175c0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
175d0 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
175e0 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
175f0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
17600 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
17610 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
17620 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
17630 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
17640 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
17650 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
17660 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
17670 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
17680 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
17690 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
176a0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
176b0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
176c0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
176d0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
176e0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
176f0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
17700 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
17710 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
17720 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
17730 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
17740 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
17750 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
17760 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
17770 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70  er->nHit);.    p
17780 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
17790 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
177a0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
177b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
177c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
177d0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
177e0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
177f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
17800 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
17810 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
17820 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
17830 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17840 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
17850 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
17860 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
17870 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
17880 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
17890 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
178a0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
178b0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
178c0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
178d0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
178e0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
178f0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
17900 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
17910 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
17920 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
17930 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
17940 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
17950 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
17960 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
17970 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
17980 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
17990 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
179a0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
179b0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
179c0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
179d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
179e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
179f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17a00 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
17a10 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17a20 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
17a30 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
17a40 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
17a50 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
17a60 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
17a70 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
17a80 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
17a90 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
17aa0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
17ab0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
17ad0 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
17ae0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
17af0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
17b00 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
17b10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
17b20 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
17b30 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
17b40 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
17b50 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
17b60 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
17b70 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
17b80 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
17b90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17ba0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
17bb0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17bc0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
17bd0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
17be0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
17bf0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
17c00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
17c10 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
17c20 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
17c30 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17c40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
17c50 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
17c60 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
17c70 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
17c80 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
17c90 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
17ca0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
17cb0 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
17cc0 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
17cd0 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
17ce0 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
17cf0 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
17d00 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
17d10 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
17d20 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
17d30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
17d40 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
17d50 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
17d60 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
17d70 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
17d80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
17d90 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
17da0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
17db0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
17dc0 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
17dd0 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
17de0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
17df0 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
17e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17e10 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
17e20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
17e30 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
17e40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
17e50 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
17e60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17e70 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
17e80 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
17e90 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
17ea0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17eb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
17ec0 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
17ed0 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
17ee0 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
17ef0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
17f00 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
17f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
17f20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
17f30 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
17f40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
17f50 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
17f60 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
17f70 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
17f80 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17f90 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17fa0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17fb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17fc0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
17fd0 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
17fe0 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
17ff0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
18000 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
18010 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18030 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
18040 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
18050 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18060 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
18070 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
18080 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
18090 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
180a0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
180b0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
180c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
180d0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
180e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
180f0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
18100 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
18110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18120 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
18130 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
18140 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18150 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
18160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
18170 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
18180 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18190 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
181a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
181b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
181c0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
181d0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
181e0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
181f0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
18200 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
18210 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
18220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18230 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
18240 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
18250 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
18260 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
18270 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
18280 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
18290 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20  ->jfd,.         
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
182c0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61  tempFile);.  pPa
182d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
182e0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
182f0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
18300 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18310 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
18320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18330 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
18340 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
18350 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
18360 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
18370 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
18380 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
18390 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
183a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
183b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
183c0 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
183d0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
183e0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
183f0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
18400 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18410 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
18420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
18430 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
18440 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
18450 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
18460 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
18470 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
18480 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
18490 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
184a0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
184b0 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
184c0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
184d0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
184e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
184f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18500 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
18510 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
18520 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
18530 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
18540 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
18550 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18560 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
18570 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
18580 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18590 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
185a0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
185b0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
185c0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
185d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
185e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
185f0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
18600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18610 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
18620 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
18630 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
18640 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18650 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
18660 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69  Journal = 0;.  i
18670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
18680 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  MEM ){.    /* If
18690 20 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c   this was a mall
186a0 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68  oc() failure, th
186b0 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62  en we will not b
186c0 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  e closing the pa
186d0 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ger.    ** file.
186e0 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a   So delete any j
186f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d  ournal file we m
18700 61 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65  ay have just cre
18710 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
18720 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74  .    ** the syst
18730 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66  em will get conf
18740 75 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20  used, we have a 
18750 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
18760 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20   file and a.    
18770 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f  ** mysterious jo
18780 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72  urnal has appear
18790 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ed in the filesy
187a0 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  stem..    */.   
187b0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
187c0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
187d0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
187e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
187f0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
18800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18810 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
18820 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18830 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
18840 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
18850 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
18860 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
18870 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
18880 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
18890 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
188a0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
188b0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
188c0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
188d0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
188e0 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
188f0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
18900 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
18910 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
18920 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
18930 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
18940 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
18950 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
18960 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
18970 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
18980 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
18990 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
189a0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
189b0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
189c0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
189d0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
189e0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
189f0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
18a00 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
18a10 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
18a20 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
18a30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
18a40 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
18a50 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
18a60 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
18a70 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
18a80 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
18a90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18aa0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
18ab0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
18ac0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
18ad0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
18ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18af0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
18b00 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
18b10 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
18b20 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
18b30 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
18b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18b50 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
18b60 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
18b70 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
18b80 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
18b90 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
18ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
18bb0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
18bc0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
18bd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18be0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
18bf0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
18c00 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
18c10 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
18c20 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
18c30 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
18c40 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
18c50 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
18c60 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
18c70 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
18c80 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
18c90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
18ca0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
18cb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18cc0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
18cd0 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
18ce0 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
18cf0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18d00 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18d10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18d20 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18d30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18d40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
18d50 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
18d60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18d70 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18d80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18d90 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
18da0 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
18db0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
18dc0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
18dd0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
18de0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18df0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
18e00 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
18e10 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
18e20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
18e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
18e50 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
18e60 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
18e70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18e90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18ea0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
18eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
18ec0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
18ed0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
18ee0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
18ef0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18f10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
18f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18f50 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18f60 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  he = 0;.      TR
18f70 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
18f80 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
18f90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
18fb0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
18fc0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
18fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
18fe0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
18ff0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
19000 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19020 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
19030 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
19040 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
19050 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
19060 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
19070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
19080 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
19090 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
190a0 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
190b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
190c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
190d0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
190e0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
190f0 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
19100 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19110 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
19120 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
19130 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
19140 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
19150 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
19160 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
19170 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
19180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
19190 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
191a0 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
191b0 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
191c0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
191d0 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
191e0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
191f0 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
19200 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
19210 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
19220 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
19230 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
19240 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
19250 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
19260 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
19270 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
19280 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
19290 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
192a0 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
192b0 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
192c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
192d0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
192e0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
192f0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
19300 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
19310 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
19320 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
19330 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
19340 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
19350 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
19360 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
19370 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
19380 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
19390 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
193a0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
193b0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
193c0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
193d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
193e0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
193f0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
19400 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
19410 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
19420 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
19430 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
19440 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
19450 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
19460 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19470 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
19480 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
19490 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
194a0 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
194b0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
194c0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
194d0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
194e0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
194f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19500 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
19510 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
19520 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
19530 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
19540 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
19550 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
19560 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19570 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
19580 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
19590 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
195a0 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
195b0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
195c0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
195d0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
195e0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
195f0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
19600 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
19610 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
19620 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
19630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19640 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
19650 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
19660 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
19670 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
19680 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
19690 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
196a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
196b0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
196c0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
196d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
196e0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
196f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
19700 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
19710 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
19720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19730 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
19740 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
19750 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
19760 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
19770 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
19780 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
19790 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
197a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
197b0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
197c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
197d0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
197e0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
197f0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
19800 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
19810 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
19820 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
19830 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
19840 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
19850 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
19860 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
19870 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
19880 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
19890 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
198a0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
198b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
198c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
198d0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
198e0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
198f0 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
19900 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
19910 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
19920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19930 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
19940 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
19950 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
19960 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
19970 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19980 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
19990 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
199a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
199b0 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20  in(pData, 0);.  
199c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
199d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
199e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
199f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19a00 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
19a10 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
19a20 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
19a30 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
19a40 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
19a50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19a60 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
19a70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
19a80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19a90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19aa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19ab0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19ac0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
19ad0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
19ae0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
19af0 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
19b00 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
19b10 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
19b20 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
19b30 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
19b40 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
19b50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
19b60 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
19b70 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
19b80 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
19b90 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
19ba0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
19bb0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
19bc0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
19bd0 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
19be0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
19bf0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
19c00 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
19c10 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
19c20 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
19c30 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
19c40 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
19c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
19c60 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
19c70 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
19c80 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
19c90 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
19ca0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28           TRACE3(
19cb0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
19cc0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19cd0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19ce0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
19cf0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
19d00 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
19d10 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
19d20 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
19d30 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
19d40 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19d50 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
19d60 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
19d70 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
19d80 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f  pOrig, PGHDR_TO_
19d90 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
19da0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19dd0 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61     u32 cksum, sa
19de0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ved;.          c
19df0 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45  har *pData2, *pE
19e00 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  nd;.          /*
19e10 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
19e20 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
19e30 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
19e40 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
19e50 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
19e60 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
19e70 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
19e80 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
19e90 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
19ea0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
19eb0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
19ec0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
19ed0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
19ee0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
19ef0 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
19f00 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
19f10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
19f20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
19f30 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
19f40 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
19f50 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  2);.          pE
19f60 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50  nd = pData2 + pP
19f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19f80 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
19f90 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   -= 4;.         
19fa0 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
19fb0 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20  pEnd;.          
19fc0 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20  put32bits(pEnd, 
19fd0 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
19fe0 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d    szPg = pPager-
19ff0 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20  >pageSize+8;.   
1a000 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1a010 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1a020 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
1a030 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1a040 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1a050 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20  pData2, szPg);. 
1a060 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1a070 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
1a080 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
1a090 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a0c0 66 66 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20  ff, szPg)).     
1a0d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1a0e0 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1a100 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1a110 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1a120 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1a130 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1a140 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a150 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1a160 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1a170 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1a180 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1a190 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1a1a0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1a1b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1a1c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1a1d0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1a1e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1a1f0 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1a200 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1a210 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1a220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a230 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a240 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1a250 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1a260 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1a270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a280 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a290 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1a2a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a2b0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1a2c0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1a2d0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1a2e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1a2f0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1a300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a310 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a330 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1a340 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1a350 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1a360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
1a370 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a380 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
1a390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a3a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a3b0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1a3c0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
1a3d0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
1a3e0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1a3f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28  .        TRACE4(
1a400 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1a410 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1a420 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a430 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1a440 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1a450 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1a460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a470 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1a480 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1a490 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1a4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a4b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1a4c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1a4d0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1a4e0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1a4f0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1a500 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1a510 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1a520 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1a530 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1a540 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1a550 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1a560 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a570 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1a580 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1a590 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1a5a0 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1a5b0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1a5c0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1a5d0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1a5e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a5f0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1a600 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1a610 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1a620 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1a630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a640 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1a650 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1a660 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a670 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1a680 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1a690 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1a6a0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1a6b0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1a6c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a6d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1a6e0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1a6f0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1a700 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1a710 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1a720 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1a730 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1a740 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1a750 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1a760 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1a770 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a790 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
1a7a0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1a7b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a7c0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1a7d0 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1a7e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1a7f0 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1a800 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1a810 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1a820 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1a830 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1a840 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1a850 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a860 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1a870 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1a880 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1a890 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
1a8a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1a8b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a8c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a8d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1a8e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1a900 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1a910 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a920 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1a930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a940 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1a950 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1a960 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a970 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a980 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a990 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f     }.      page_
1a9a0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1a9b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1a9c0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1a9d0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1a9e0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1a9f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1aa00 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1aa10 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1aa20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1aa30 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1aa40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1aa50 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1aa60 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1aa70 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1aa80 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1aa90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1aaa0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1aab0 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1aac0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1aad0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1aae0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1aaf0 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1ab00 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1ab10 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1ab20 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1ab30 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1ab40 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1ab50 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1ab60 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1ab70 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1ab80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1ab90 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1aba0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1abb0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1abc0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1abd0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1abe0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1abf0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1ac00 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1ac10 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1ac20 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1ac30 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1ac40 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1ac50 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1ac60 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1ac70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1ac80 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1ac90 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1aca0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1acb0 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
1acc0 74 61 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ta){.  int rc = 
1acd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
1ace0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1acf0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1ad00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ad10 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1ad20 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
1ad30 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
1ad40 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
1ad50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
1ad60 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1ad70 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
1ad80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
1ad90 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
1ada0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1adb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1adc0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1add0 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1adf0 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
1ae00 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1ae10 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
1ae20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae40 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1ae50 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
1ae60 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1ae70 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f    int ii;..    /
1ae80 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
1ae90 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
1aea0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
1aeb0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
1aec0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1aed0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
1aee0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
1aef0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
1af00 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1af10 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
1af20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1af30 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1af40 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1af50 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1af60 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1af70 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1af80 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1af90 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1afa0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1afb0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1afc0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1afd0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1afe0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1aff0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1b000 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1b010 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1b020 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1b030 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1b040 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1b050 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1b060 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c  nPageCount = sql
1b070 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
1b080 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1b090 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
1b0a0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1b0b0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
1b0c0 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
1b0d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1b0e0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
1b0f0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
1b100 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1b110 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
1b120 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1b130 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1b140 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
1b150 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
1b160 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
1b170 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
1b180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
1b190 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
1b1a0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
1b1b0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
1b1c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1b1d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
1b1e0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
1b1f0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1b200 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->aInJournal || 
1b210 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
1b220 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70   .          pg>p
1b230 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b240 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61  e || !(pPager->a
1b250 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26  InJournal[pg/8]&
1b260 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20  (1<<(pg&7))).   
1b270 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69     ) {.        i
1b280 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
1b290 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1b2a0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
1b2b0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  pPage;.         
1b2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1b2d0 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
1b2e0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
1b2f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b310 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1b320 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1b330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b340 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1b350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1b360 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b370 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1b380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b390 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1b3a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1b3b0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1b3c0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1b3d0 65 72 5f 77 72 69 74 65 28 70 44 61 74 61 29 3b  er_write(pData);
1b3e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b400 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
1b410 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
1b420 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
1b430 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
1b440 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  * to sqlite3page
1b450 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
1b460 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1b470 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1b480 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1b490 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1b4a0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1b4b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1b4c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
1b4d0 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
1b4e0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1b4f0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1b500 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
1b510 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
1b520 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1b530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1b540 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
1b550 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
1b560 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1b570 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
1b580 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
1b590 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
1b5a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1b5b0 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
1b5c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1b5d0 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
1b5e0 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
1b5f0 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
1b600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1b610 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1b620 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
1b630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b640 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1b650 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1b660 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1b670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b680 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1b690 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50  pPage, pData, pP
1b6a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1b6b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b6c0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1b6d0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1b6e0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1b6f0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1b700 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1b710 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1b720 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1b730 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1b740 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1b750 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
1b760 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
1b770 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1b780 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1b790 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1b7a0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1b7b0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1b7c0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1b7d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1b7e0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1b7f0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1b800 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1b810 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1b820 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1b830 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1b840 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1b850 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1b860 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1b870 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1b880 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1b890 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1b8a0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1b8b0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
1b8c0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1b8d0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1b8e0 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1b8f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1b900 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1b910 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1b920 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1b930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b940 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1b950 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1b960 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1b970 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1b980 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
1b990 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
1b9a0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1b9b0 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1b9c0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1b9d0 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1b9e0 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1b9f0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1ba00 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1ba10 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1ba20 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1ba30 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1ba40 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1ba50 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1ba60 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1ba70 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1ba80 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1ba90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1baa0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1bab0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1bac0 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1bad0 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1bae0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1baf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1bb00 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1bb10 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
1bb20 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1bb30 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1bb40 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
1bb50 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
1bb60 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1bb70 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1bb80 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
1bb90 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1bba0 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
1bbb0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
1bbc0 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
1bbd0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1bbe0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1bbf0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1bc00 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1bc10 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1bc20 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1bc30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1bc40 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
1bc50 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a  t( pPg!=0 );  /*
1bc60 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f   We never call _
1bc70 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73  dont_write unles
1bc80 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  s the page is in
1bc90 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61   mem */.  pPg->a
1bca0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1bcb0 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1bcc0 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1bcd0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1bce0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bcf0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1bd00 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1bd10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1bd20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1bd30 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1bd40 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1bd50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1bd60 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1bd70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1bd80 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1bd90 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1bda0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1bdb0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1bdc0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1bdd0 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1bde0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1bdf0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1be00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1be10 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1be20 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1be30 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1be40 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1be50 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1be60 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1be70 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1be80 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1be90 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1bea0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1beb0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1bec0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1bed0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1bee0 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1bef0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1bf00 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1bf10 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1bf20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1bf30 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1bf40 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1bf50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bf60 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
1bf70 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1bf80 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1bf90 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1bfa0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
1bfb0 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
1bfc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20  Pager, pgno)).  
1bfd0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1bfe0 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
1bff0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c000 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1c010 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1c020 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1c030 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1c040 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1c050 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1c060 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1c070 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1c080 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1c090 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1c0a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1c0b0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1c0c0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1c0d0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c0e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1c0f0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1c100 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1c110 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1c120 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
1c130 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1c140 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
1c150 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
1c160 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
1c170 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
1c180 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c190 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65  >pPager;..  asse
1c1a0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c1b0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1c1c0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1c1d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1c1e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1c1f0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
1c200 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
1c210 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1c220 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  || MEMDB ) retur
1c230 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
1c240 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
1c250 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
1c260 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1c270 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c280 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1c290 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
1c2a0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1c2b0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1c2c0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1c2d0 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
1c2e0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66  rnal = 1;.    if
1c2f0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1c300 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
1c310 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1c320 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1c330 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1c340 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1c350 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1c360 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1c370 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
1c380 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1c390 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1c3a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1c3b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41      IOTRACE(("GA
1c3c0 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
1c3d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1c3e0 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  o)).  }.  if( pP
1c3f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c400 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
1c410 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1c420 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1c430 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1c440 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1c450 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1c460 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1c470 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
1c480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1c490 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1c4a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1c4b0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1c4c0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1c4d0 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
1c4e0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1c4f0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1c500 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
1c510 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1c520 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
1c530 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
1c540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
1c550 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
1c560 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
1c570 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
1c580 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
1c590 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c5a0 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
1c5b0 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
1c5c0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1c5d0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
1c5e0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
1c5f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1c600 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1c610 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1c620 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1c640 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1c650 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1c660 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
1c670 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
1c680 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c690 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  R;.  }.  TRACE2(
1c6a0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
1c6b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c6c0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1c6d0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1c6e0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1c6f0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1c700 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
1c710 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
1c720 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
1c730 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
1c740 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1c750 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1c760 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1c770 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1c780 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1c790 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1c7a0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1c7b0 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1c7c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c7d0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
1c7e0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
1c7f0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1c800 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c810 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1c820 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
1c830 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
1c840 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1c850 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1c860 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1c870 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1c880 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
1c890 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1c8a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
1c8b0 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
1c8c0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1c8d0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
1c8e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
1c8f0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1c900 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1c910 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1c920 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c930 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1c940 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
1c950 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
1c960 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
1c970 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
1c980 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
1c990 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
1c9a0 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
1c9b0 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
1c9c0 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
1c9d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c9e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c9f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1ca00 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1ca10 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1ca20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  k(pPager);.    r
1ca30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1ca40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ca50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1ca60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1ca70 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
1ca80 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
1ca90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1caa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1cab0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1cac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cad0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
1cae0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
1caf0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
1cb00 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
1cb10 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
1cb20 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
1cb30 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
1cb40 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
1cb50 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
1cb60 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
1cb70 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
1cb80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1cb90 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
1cba0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
1cbb0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
1cbc0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
1cbd0 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
1cbe0 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49  g protocol (SQLI
1cbf0 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20  TE_PROTOCOL) or 
1cc00 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
1cc10 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
1cc20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
1cc30 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1cc40 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
1cc50 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
1cc60 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
1cc70 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
1cc80 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
1cc90 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
1cca0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
1ccb0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
1ccc0 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
1ccd0 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
1cce0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ccf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cd00 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
1cd10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1cd20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
1cd30 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
1cd40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1cd50 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1cd60 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1cd70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
1cd80 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
1cd90 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1cda0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1cdb0 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
1cdc0 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
1cdd0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
1cde0 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
1cdf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ce00 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
1ce10 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1ce20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
1ce30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ce40 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
1ce50 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
1ce60 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
1ce70 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
1ce80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
1ce90 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
1cea0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1ceb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1cec0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
1ced0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1cee0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1cef0 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
1cf00 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1cf10 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
1cf20 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
1cf30 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
1cf40 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
1cf50 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1cf60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cf70 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
1cf80 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
1cf90 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1cfa0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1cfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
1cfc0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
1cfd0 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
1cfe0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1cff0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1d000 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
1d010 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
1d020 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
1d030 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1d040 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1d050 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1d060 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1d070 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
1d080 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
1d090 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1d0a0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1d0b0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
1d0c0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1d0d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1d0e0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1d0f0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
1d100 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
1d110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1d120 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1d130 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1d140 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
1d150 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
1d160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d170 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1d180 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
1d190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d1a0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
1d1b0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1d1c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
1d1d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1d1e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d1f0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1d200 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1d210 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
1d220 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1d230 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
1d240 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
1d250 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
1d260 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1d270 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1d280 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1d290 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d2a0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1d2b0 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
1d2c0 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  = pager_reload_c
1d2d0 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
1d2e0 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e    rc2 = pager_un
1d2f0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1d300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d320 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1d330 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1d340 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1d350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1d360 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d370 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   = -1;..  /* If 
1d380 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1d390 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
1d3a0 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
1d3b0 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
1d3c0 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20  ger.  ** cache. 
1d3d0 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
1d3e0 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
1d3f0 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
1d400 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72   error .  ** per
1d410 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
1d420 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1d430 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1d440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d450 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
1d460 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
1d470 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
1d480 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1d490 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1d4a0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
1d4b0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
1d4c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
1d4d0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
1d4e0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1d4f0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1d500 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
1d510 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1d520 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1d530 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
1d540 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1d550 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
1d560 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1d570 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
1d580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1d590 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
1d5a0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1d5b0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1d5c0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
1d5d0 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67  .int *sqlite3pag
1d5e0 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
1d5f0 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
1d600 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
1d610 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
1d620 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
1d630 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
1d640 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
1d650 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
1d660 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1d670 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
1d680 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
1d690 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1d6a0 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
1d6b0 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
1d6c0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
1d6d0 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
1d6e0 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
1d6f0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
1d700 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
1d710 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
1d720 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
1d730 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
1d740 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
1d750 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
1d760 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1d770 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
1d780 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d790 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
1d7a0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
1d7b0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1d7c0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1d7d0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1d7e0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1d7f0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1d800 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1d810 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1d820 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1d830 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1d840 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
1d850 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d860 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
1d870 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1d880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1d890 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d8a0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
1d8b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d8c0 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
1d8d0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
1d8e0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d8f0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1d900 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
1d910 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1d920 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1d930 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1d940 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
1d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d960 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1d970 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1d980 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1d990 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
1d9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d9b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1d9c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1d9d0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
1d9e0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
1d9f0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1da00 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1da10 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1da20 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
1da30 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
1da40 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1da50 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
1da60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1da70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1da80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1da90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1daa0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1dab0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
1dac0 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
1dad0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
1dae0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
1daf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1db00 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
1db10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1db20 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
1db30 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
1db40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1db50 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
1db60 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1db70 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
1db80 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
1db90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1dba0 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
1dbb0 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
1dbc0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
1dbd0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
1dbe0 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
1dbf0 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74  temp(&pPager->st
1dc00 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
1dc10 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1dc20 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
1dc30 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1dc40 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1dc50 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1dc60 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1dc70 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
1dc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dc90 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
1dca0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
1dcb0 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
1dcc0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1dcd0 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
1dce0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1dcf0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1dd00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dd10 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
1dd20 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1dd30 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
1dd40 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1dd50 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1dd60 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1dd70 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
1dd80 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
1dd90 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
1dda0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1ddb0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1ddc0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1ddd0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
1dde0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1ddf0 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
1de00 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
1de10 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
1de20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
1de30 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
1de40 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
1de50 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1de60 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1de70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1de80 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
1de90 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
1dea0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
1deb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dec0 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
1ded0 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1dee0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1def0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
1df00 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1df10 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1df20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1df30 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1df40 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1df50 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1df60 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1df70 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1df80 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1df90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1dfa0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1dfb0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1dfc0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1dfd0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1dfe0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1dff0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1e000 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1e010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e020 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
1e030 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
1e040 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e050 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c  3pager_stmt_roll
1e060 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1e070 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1e080 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1e090 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52  tInUse ){.    TR
1e0a0 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
1e0b0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
1e0c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e0d0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1e0e0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1e0f0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
1e100 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
1e110 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1e120 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
1e130 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1e140 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1e150 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1e160 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1e170 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1e180 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
1e190 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1e1a0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
1e1b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1e1c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e1d0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
1e1e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
1e1f0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1e200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e210 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1e220 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1e230 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
1e240 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
1e250 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1e260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e280 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
1e290 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1e2a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e2b0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
1e2c0 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
1e2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1e2e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1e2f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1e300 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
1e310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e320 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1e330 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1e340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1e350 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1e360 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
1e370 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1e380 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1e390 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
1e3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e3b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
1e3c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e3d0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1e3e0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
1e3f0 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  _dirname(Pager *
1e400 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1e410 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
1e420 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
1e430 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1e440 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
1e450 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
1e460 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1e470 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
1e480 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1e490 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1e4a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
1e4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e4c0 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
1e4d0 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
1e4e0 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
1e4f0 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
1e500 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
1e510 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
1e520 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
1e530 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e  lite3pager_nosyn
1e540 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
1e550 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1e560 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a  r->noSync;.}../*
1e570 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
1e580 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
1e590 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e5a0 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
1e5b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e5c0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
1e5d0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
1e5e0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
1e5f0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
1e600 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
1e610 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
1e620 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
1e630 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
1e640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e650 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1e660 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1e670 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1e680 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1e690 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1e6a0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1e6b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e6c0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1e6d0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1e6e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
1e6f0 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
1e700 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
1e710 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1e720 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1e730 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1e740 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1e750 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
1e760 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1e770 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
1e780 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1e790 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e7a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
1e7b0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1e7c0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1e7d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1e7e0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
1e7f0 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
1e800 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
1e810 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
1e820 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
1e830 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
1e840 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1e850 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1e860 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
1e870 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1e880 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1e890 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1e8a0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1e8b0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 70  e_counter++;.  p
1e8c0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e8d0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
1e8e0 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
1e8f0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1e900 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
1e910 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
1e920 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  /.  sqlite3pager
1e930 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
1e940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e950 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
1e960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e970 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
1e980 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
1e990 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
1e9a0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
1e9b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1e9c0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1e9d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1e9e0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
1e9f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
1ea00 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
1ea10 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
1ea20 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
1ea30 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
1ea40 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1ea50 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1ea60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ea70 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
1ea80 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
1ea90 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
1eaa0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
1eab0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1eac0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
1ead0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
1eae0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
1eaf0 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
1eb00 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
1eb10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1eb20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1eb30 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
1eb40 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1eb50 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
1eb60 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
1eb70 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
1eb80 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
1eb90 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
1eba0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
1ebb0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
1ebc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
1ebd0 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  c() call..**.** 
1ebe0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
1ebf0 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
1ec00 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
1ec10 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
1ec20 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
1ec30 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
1ec40 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1ec50 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
1ec60 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1ec70 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  r_sync(Pager *pP
1ec80 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
1ec90 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
1eca0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
1ecb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1ecc0 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41    TRACE4("DATABA
1ecd0 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
1ece0 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
1ecf0 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
1ed00 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1ed10 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
1ed20 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
1ed30 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1ed40 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
1ed50 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
1ed60 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
1ed70 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1ed80 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1ed90 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1eda0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1edb0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1edc0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
1edd0 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
1ede0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
1edf0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1ee00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ee10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ee20 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n );..    /* If 
1ee30 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ee40 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
1ee50 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1ee60 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
1ee70 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
1ee80 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
1ee90 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
1eea0 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
1eeb0 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
1eec0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
1eed0 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
1eee0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
1eef0 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
1ef00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1ef10 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
1ef20 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
1ef30 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
1ef40 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1ef50 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
1ef60 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
1ef70 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
1ef80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1ef90 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1efa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1efb0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1efc0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
1efd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1efe0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1eff0 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64  sync_exit;.#ifnd
1f000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f010 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1f020 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1f030 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1f040 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
1f050 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
1f060 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
1f070 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
1f080 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
1f090 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
1f0a0 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
1f0b0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1f0c0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1f0d0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
1f0e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1f0f0 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f  no i;.        vo
1f100 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  id *pPage;.     
1f110 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
1f120 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1f130 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
1f140 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
1f150 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1f160 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
1f170 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
1f180 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1f190 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
1f1a0 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
1f1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f1c0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1f1d0 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  get(pPager, i, &
1f1e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1f1f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f200 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f210 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1f220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f230 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1f240 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f250 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1f260 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1f270 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f280 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f290 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f2b0 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
1f2c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1f2d0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
1f2e0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1f2f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f300 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f310 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1f320 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1f330 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1f340 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f350 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f360 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  xit;.    }..#ifn
1f370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f380 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1f390 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1f3a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f3b0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
1f3c0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
1f3d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f3e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f3f0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f400 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1f410 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
1f420 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
1f430 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1f440 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
1f450 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
1f460 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
1f470 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1f480 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1f490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f4a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f4b0 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  c_exit;..    /* 
1f4c0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1f4d0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
1f4e0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1f4f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
1f500 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1f510 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
1f520 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
1f530 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
1f540 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
1f550 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1f560 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1f570 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26  else if( MEMDB &
1f580 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  & nTrunc!=0 ){. 
1f590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1f5a0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1f5b0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1f5c0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
1f5d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1f5e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f5f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
1f600 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
1f610 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1f620 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f  pData to locatio
1f630 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
1f640 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
1f650 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
1f660 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75  rences to the cu
1f670 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e  rrent page pgno.
1f680 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65   If current page
1f690 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20  .** pgno is not 
1f6a0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
1f6b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
1f6c0 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74   it is not writt
1f6d0 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62  en there by.** b
1f6e0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
1f6f0 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
1f700 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61   to the page pDa
1f710 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20  ta refers to on 
1f720 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73  entry to.** this
1f730 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1f740 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
1f750 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74  e page refered t
1f760 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69  o by pData remai
1f770 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
1f780 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
1f790 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1f7a0 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69  th page pData (i
1f7b0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
1f7c0 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
1f7d0 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
1f7e0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
1f7f0 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
1f800 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1f810 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
1f820 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
1f830 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
1f840 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1f850 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
1f860 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
1f870 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
1f880 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1f890 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
1f8a0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
1f8b0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
1f8c0 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
1f8d0 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
1f8e0 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
1f8f0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
1f900 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1f910 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
1f920 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f   sqlite3pager_mo
1f930 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
1f940 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74  ager, void *pDat
1f950 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  a, Pgno pgno){. 
1f960 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
1f970 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
1f980 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a);.  PgHdr *pPg
1f990 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20  Old; .  int h;. 
1f9a0 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
1f9b0 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
1f9c0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1f9d0 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56  ;..  TRACE5("MOV
1f9e0 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
1f9f0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
1fa00 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
1fa10 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1fa20 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1fa30 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
1fa40 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
1fa50 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
1fa60 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1fa70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69  gno, pgno))..  i
1fa80 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
1fa90 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
1faa0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
1fab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1fac0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  g->inJournal );.
1fad0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1fae0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
1faf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1fb00 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
1fb10 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
1fb20 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
1fb30 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
1fb40 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
1fb50 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
1fb60 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
1fb70 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
1fb80 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
1fb90 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
1fba0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
1fbb0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
1fbc0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1fbd0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
1fbe0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
1fbf0 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
1fc00 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
1fc10 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
1fc20 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
1fc30 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
1fc40 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64  e..  */.  pPgOld
1fc50 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1fc60 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1fc70 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
1fc80 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
1fc90 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
1fca0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1fcb0 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
1fcc0 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1fcd0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66  (pPgOld);.    if
1fce0 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79  ( pPgOld->needSy
1fcf0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
1fd00 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f  rt( pPgOld->inJo
1fd10 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70  urnal );.      p
1fd20 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1fd30 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  1;.      pPg->ne
1fd40 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1fd50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fd60 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1fd70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
1fd80 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
1fd90 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
1fda0 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
1fdb0 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
1fdc0 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
1fdd0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
1fde0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1fdf0 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
1fe00 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
1fe10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1fe20 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1fe30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1fe40 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1fe50 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1fe60 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1fe70 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1fe80 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1fe90 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1fea0 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1feb0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1fec0 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1fed0 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
1fee0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
1fef0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1ff00 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1ff10 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1ff20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1ff30 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1ff40 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1ff50 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1ff60 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1ff70 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1ff80 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1ff90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1ffa0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1ffb0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1ffc0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1ffd0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1ffe0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1fff0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
20000 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
20010 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
20020 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
20030 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
20040 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
20050 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
20060 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
20070 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
20080 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
20090 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
200a0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
200b0 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
200c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
200d0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
200e0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
200f0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
20100 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
20110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
20120 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
20130 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
20140 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20150 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
20160 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
20170 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
20180 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
20190 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
201a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
201b0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
201c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
201d0 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
201e0 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
201f0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
20200 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
20210 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
20220 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
20230 44 69 72 74 79 28 44 41 54 41 5f 54 4f 5f 50 47  Dirty(DATA_TO_PG
20240 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 29 3b  HDR(pNeedSync));
20250 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
20260 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
20270 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
20280 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
20290 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
202a0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
202b0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
202c0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
202d0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
202e0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
202f0 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
20300 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
20310 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
20320 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
20330 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
20340 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
20350 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
20360 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
20370 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
20380 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
20390 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
203a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
203b0 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
203c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
203d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
203e0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
203f0 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
20400 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
20410 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
20420 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
20430 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
20440 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
20450 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
20460 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
20470 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
20480 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
20490 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
204a0 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
204b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
204c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
204d0 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
204e0 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
204f0 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
20500 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
20510 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
20520 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
20530 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20540 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.