/ Hex Artifact Content
Login

Artifact 75019bab2ddafdd443413c38f489c15d18b95ea2:


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: 37 20 32 30 30 37 2f 30 33 2f 32 36 20 31 32 3a  7 2007/03/26 12:
0360: 32 36 3a 32 37 20 64 61 6e 69 65 6c 6b 31 39 37  26:27 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 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0de0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0df0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0e00: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e10: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e20: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e30: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e40: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e50: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e60: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e70: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e80: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e90: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0ea0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0eb0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0ec0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0ed0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0ee0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0ef0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
0f00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0f10: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0f20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0f30: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0f40: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0f50: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0f60: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0f70: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0f80: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0f90: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0fa0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0fb0: 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62  VE occurs when b
0fc0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
0fd0: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
0fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0ff0: 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71  le.  After an sq
1000: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1010: 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  ck().** or sqlit
1020: 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e_pager_commit()
1030: 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73  , the state goes
1040: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1050: 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e  HARED..*/.#defin
1060: 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20  e PAGER_UNLOCK  
1070: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41      0.#define PA
1080: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
1090: 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53  1   /* same as S
10a0: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  HARED_LOCK */.#d
10b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45  efine PAGER_RESE
10c0: 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73  RVED    2   /* s
10d0: 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f  ame as RESERVED_
10e0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1100: 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    4   /* same as
1110: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
1120: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1130: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a  _SYNCED      5..
1140: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  /*.** If the SQL
1150: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1160: 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20  D_LOCK macro is 
1170: 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63  set to true at c
1180: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20  ompile-time,.** 
1190: 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65  then failed atte
11a0: 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65  mpts to get a re
11b0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c  served lock will
11c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11d0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
11e0: 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  is is off by def
11f0: 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68  ault.  To see wh
1200: 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  y, consider the 
1210: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
1220: 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f  io:.** .** Suppo
1230: 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65  se thread A alre
1240: 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64  ady has a shared
1250: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1260: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1270: 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72  .** Thread B alr
1280: 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72  eady has a reser
1290: 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  ved lock and wan
12a0: 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ts an exclusive 
12b0: 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74  lock.  If.** bot
12c0: 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73  h threads are us
12d0: 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63  ing their busy c
12e0: 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67  allbacks, it mig
12f0: 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d  ht be a long tim
1300: 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20  e.** be for one 
1310: 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67  of the threads g
1320: 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77  ive up and allow
1330: 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70  s the other to p
1340: 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69  roceed..** But i
1350: 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79  f the thread try
1360: 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72  ing to get the r
1370: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76  eserved lock giv
1380: 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a  es up quickly.**
1390: 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e   (if it never in
13a0: 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63  vokes its busy c
13b0: 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68  allback) then th
13c0: 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c  e contention wil
13d0: 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64  l be.** resolved
13e0: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66   quickly..*/.#if
13f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59  ndef SQLITE_BUSY
1400: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23  _RESERVED_LOCK.#
1410: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
1420: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1430: 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 0.#endif../*.*
1440: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75  * This macro rou
1450: 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f  nds values up so
1460: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
1470: 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  ue is an address
1480: 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e   it.** is guaran
1490: 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64  teed to be an ad
14a0: 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c  dress that is al
14b0: 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79  igned to an 8-by
14c0: 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
14d0: 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c  #define FORCE_AL
14e0: 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28  IGNMENT(X)   (((
14f0: 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a  X)+7)&~7)../*.**
1500: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1510: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1520: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1530: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1540: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1550: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1560: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1570: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1580: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1590: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
15a0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
15b0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
15c0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
15d0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
15e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
15f0: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1600: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1610: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1620: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1630: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1640: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1650: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1660: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1670: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1680: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1690: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
16a0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
16b0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
16c0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
16d0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
16e0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
16f0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1700: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1710: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1720: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1730: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1740: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1750: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1760: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1770: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1780: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1790: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
17a0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
17b0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
17c0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
17d0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
17e0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
17f0: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1800: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1810: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1830: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1840: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1850: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1860: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1870: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1880: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1890: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
18a0: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
18b0: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
18c0: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e0: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
18f0: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
1900: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
1910: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1920: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1930: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
1940: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
1950: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
1960: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
1970: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
1980: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
1990: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
19a0: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
19b0: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
19c0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
19d0: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
19e0: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a00: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
1a10: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1a20: 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50   *pNextStmt, *pP
1a30: 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73  revStmt;  /* Lis
1a40: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
1a50: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1a60: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  nal */.  u8 inJo
1a70: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1a90: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
1aa0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
1ab0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
1ae0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1af0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  ubjournal */.  u
1b00: 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20  8 dirty;        
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b20: 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64   TRUE if we need
1b30: 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63   to write back c
1b40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e  hanges */.  u8 n
1b50: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
1b70: 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  nc journal befor
1b80: 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70  e writing this p
1b90: 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  age */.  u8 alwa
1ba0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1bc0: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1bd0: 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  () for this page
1be0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20   */.  short int 
1bf0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1c00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c10: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1c20: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1c30: 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44  *pDirty, *pPrevD
1c40: 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74  irty;    /* Dirt
1c50: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32  y pages */.  u32
1c60: 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20   notUsed;       
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c80: 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23  uffer space */.#
1c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ca0: 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70  CK_PAGES.  u32 p
1cb0: 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ageHash;.#endif.
1cc0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67    /* pPager->pag
1cd0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70  eSize bytes of p
1ce0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
1cf0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
1d00: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
1d10: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
1d20: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
1d30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
1d40: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  ./*.** For an in
1d50: 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74  -memory only dat
1d60: 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72  abase, some extr
1d70: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
1d80: 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a   recorded about.
1d90: 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20  ** each page so 
1da0: 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e  that changes can
1db0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1dc0: 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73    (Journal files
1dd0: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64   are not.** used
1de0: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1df0: 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20  atabases.)  The 
1e00: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d  following inform
1e10: 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ation is added t
1e20: 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  o.** the end of 
1e30: 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63  every EXTRA bloc
1e40: 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  k for in-memory 
1e50: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
1e60: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1e70: 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
1e80: 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79  n added directly
1e90: 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74   to the PgHdr st
1ea0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20  ructure..** But 
1eb0: 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61  then it would ta
1ec0: 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38  ke up an extra 8
1ed0: 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   bytes of storag
1ee0: 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72  e on every PgHdr
1ef0: 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73  .** even for dis
1f00: 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  k-based database
1f10: 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74  s.  Splitting it
1f20: 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74   out saves 8 byt
1f30: 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  es.  This.** is 
1f40: 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f  only a savings o
1f50: 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65  f 0.8% but those
1f60: 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64   percentages add
1f70: 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20   up..*/.typedef 
1f80: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
1f90: 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75   PgHistory;.stru
1fa0: 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20  ct PgHistory {. 
1fb0: 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20   u8 *pOrig;     
1fc0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65  /* Original page
1fd0: 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20   text.  Restore 
1fe0: 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c  to this on a ful
1ff0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  l rollback */.  
2000: 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  u8 *pStmt;     /
2010: 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73  * Text as it was
2020: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2030: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
2040: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
2050: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
2060: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
2070: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
2080: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
2090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
20a0: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
20b0: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
20c0: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
20d0: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
20e0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
20f0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2100: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2110: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2120: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2130: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2140: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
2150: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
2160: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
2170: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
2180: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
2190: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
21a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
21b0: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
21c0: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
21d0: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
21e0: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
21f0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2200: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2210: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2220: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2230: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2240: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
2250: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
2260: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
2270: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
2280: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
2290: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
22a0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
22b0: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
22c0: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
22d0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
22e0: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
22f0: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2300: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2310: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2320: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2340: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
2350: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
2360: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
2370: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
2380: 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f  RUPT, SQLITE_PRO
2390: 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49  TOCOL.** or SQLI
23a0: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
23b0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
23c0: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
23d0: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
23e0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
23f0: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
2400: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
2410: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
2420: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
2430: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
2440: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
2450: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
2460: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
2470: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
2480: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
2490: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
24a0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
24b0: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
24c0: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
24d0: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
24e0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
24f0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61  Destructor)(DbPa
3410: 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  ge*,int); /* Cal
3420: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
3430: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
3440: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
3450: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
3460: 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c  ,int);   /* Call
3470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3480: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
3490: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a  es */.  void *(*
34a0: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
34b0: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
34c0: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
34d0: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
34e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
34f0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
3500: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
3510: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
3520: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3540: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
3550: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
3560: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
3570: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
3580: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
3590: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
35a0: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
35b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
35d0: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
35e0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
35f0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3600: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3610: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3620: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3630: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3640: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
3650: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
3660: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
3670: 2f 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43  /.  u32 iChangeC
3680: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
3690: 2f 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75  /* Db change-cou
36a0: 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63  nter for which c
36b0: 61 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f  ache is valid */
36c0: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36e0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
36f0: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3700: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3710: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
3720: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
3730: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
3740: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
3750: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
3760: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
3770: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
3780: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
3790: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
37a0: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 7d 3b 0a 0a  -counter */.};..
37b0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
37c0: 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20  TEST is defined 
37d0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  then increment t
37e0: 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76 65  he variable give
37f0: 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67 75  n in.** the argu
3800: 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ment.*/.#ifdef S
3810: 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66  QLITE_TEST.# def
3820: 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29  ine TEST_INCR(x)
3830: 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    x++.#else.# de
3840: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
3850: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3860: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3870: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3880: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3890: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
38a0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
38b0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
38c0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
38d0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
38e0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
38f0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3900: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3910: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3920: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3930: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3940: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3950: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3960: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3970: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3980: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3990: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
39a0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
39b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
39c0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
39d0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
39e0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
39f0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3a00: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3a20: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3a30: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3a40: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3a50: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3a60: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3a70: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3a80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a90: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3aa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3ab0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ac0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3ad0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3ae0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3af0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3b00: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3b10: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3b20: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3b30: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3b40: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3b50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3b60: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3b70: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3b80: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3b90: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3ba0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3bb0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3bc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3bd0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3be0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3bf0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3c00: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3c10: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3c20: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3c30: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3c40: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3c50: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3c60: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3c70: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3c80: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3c90: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3ca0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3cb0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3cc0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3cd0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3ce0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3cf0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3d00: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3d10: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3d20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3d30: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3d40: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3d50: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3d60: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3d70: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3d80: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3d90: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3da0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3db0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3dc0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3de0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3df0: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3e00: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3e10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3e20: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3e30: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3e40: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3e50: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3e60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3e70: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3e80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3e90: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3ea0: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3eb0: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3ec0: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3ed0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3ee0: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3ef0: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3f00: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3f10: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3f20: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3f30: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3f40: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3f50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3f60: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3f70: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3f80: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3f90: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3fa0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3fb0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3fc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3fd0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3fe0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3ff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
4000: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
4010: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
4020: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
4030: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
4040: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
4050: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
4060: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
4070: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
4080: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4090: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
40a0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
40b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
40c0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
40d0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
40e0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
40f0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
4100: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
4110: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
4120: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
4130: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
4140: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
4150: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
4160: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
4170: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
4180: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
4190: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
41a0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
41b0: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
41c0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
41d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
41e0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
41f0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
4200: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
4210: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
4220: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
4230: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
4240: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
4250: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
4260: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
4270: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4280: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
4290: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
42a0: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
42b0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
42c0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
42d0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
42e0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
42f0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
4300: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
4310: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
4320: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  647../*.** Enabl
4330: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4340: 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20  t tracking (for 
4350: 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a  debugging) here:
4360: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4370: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
4380: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
4390: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
43a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
43b0: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
43c0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
43d0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
43e0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
43f0: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
4400: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4410: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4420: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4430: 3d 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f  =%p nRef=%-3d to
4440: 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  tal=%d\n",.     
4450: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4460: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4470: 6e 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d  nRef, p->pPager-
4480: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4490: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
44a0: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
44b0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
44c0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
44d0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
44e0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
44f0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
4500: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  O(X).#endif.../*
4510: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
4520: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4530: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
4540: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
4550: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
4560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4570: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
4580: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
4590: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
45a0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
45b0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
45c0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
45d0: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
45e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
45f0: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
4600: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
4610: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
4620: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
4630: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
4640: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
4650: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
4660: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
4670: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4680: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
4690: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
46a0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
46b0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
46c0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
46d0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
46e0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
46f0: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
4700: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
4710: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4720: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
4730: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
4740: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
4750: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4760: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
4770: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
4780: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
4790: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
47a0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
47b0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
47c0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
47d0: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
47e0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
47f0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
4800: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
4810: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4820: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
4830: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4840: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4850: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4860: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4880: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4890: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
48a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
48b0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
48c0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
48d0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
48e0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
48f0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
4900: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
4910: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4920: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4930: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4940: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4950: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4960: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
4970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4980: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4990: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
49a0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
49b0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
49d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
49e0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
49f0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
4a00: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
4a10: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
4a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a30: 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a  put32bits(char *
4a40: 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  ac, u32 val){.  
4a50: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4a60: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4a70: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4a80: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4a90: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4aa0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4ab0: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4ac0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ad0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4ae0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4af0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4b00: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4b10: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4b20: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4b30: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4b50: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4b60: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4b70: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4b80: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4b90: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4ba0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4bb0: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4bc0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4bd0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4be0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4bf0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4c00: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4c10: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4c20: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4c30: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4c40: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4c50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c60: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4c70: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4c80: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4c90: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4ca0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4cb0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4cc0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4cd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
4ce0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4cf0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4d00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4d10: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4d20: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4d30: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4d40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4d50: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4d60: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4d70: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4d80: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4d90: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4da0: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4db0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4dc0: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4dd0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4de0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4df0: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4e00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4e10: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4e20: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4e30: 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52  UPT or SQLITE_PR
4e40: 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65  OTOCOL,.** the e
4e50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4e60: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4e70: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4e80: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4e90: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4ea0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4eb0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4ec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4ed0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4ee0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4ef0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4f00: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4f10: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
4f20: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4f30: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
4f40: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
4f50: 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d  .  if( .    rc2=
4f60: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4f70: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4f80: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4f90: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4fa0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4fb0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4fc0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4fd0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4fe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4ff0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
5000: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
5010: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
5020: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
5030: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
5040: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
5050: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
5060: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
5070: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
5080: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
5090: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
50a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
50b0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
50c0: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
50d0: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
50e0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
50f0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
5100: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
5110: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5120: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
5130: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
5140: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
5150: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
5160: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
5170: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
5180: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
5190: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
51a0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
51b0: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
51c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
51d0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
51e0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
51f0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
5200: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
5210: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5220: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
5230: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
5240: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
5250: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
5260: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5270: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
5280: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
5290: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
52a0: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
52b0: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
52c0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
52d0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
52e0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
52f0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
5300: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
5310: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5320: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5330: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5340: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5350: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
5360: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5370: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5380: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5390: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
53a0: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
53b0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
53c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
53d0: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
53e0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
53f0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
5400: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5410: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
5420: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
5430: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
5440: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
5450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5460: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
5470: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5480: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5490: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
54a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
54b0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
54c0: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
54d0: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
54e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
54f0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
5500: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
5510: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
5520: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
5530: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
5540: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
5550: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
5560: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
5570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5580: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5590: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
55a0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
55b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
55c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
55d0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
55e0: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
55f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5600: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
5610: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5620: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
5630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5640: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5650: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5660: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
5670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5690: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
56a0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
56b0: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
56c0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
56d0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
56e0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
56f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5700: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
5710: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
5720: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5730: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5740: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
5750: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
5760: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
5770: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5780: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5790: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
57a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
57b0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
57c0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
57d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
57e0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
57f0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5800: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5810: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
5820: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
5830: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
5840: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
5850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5860: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5870: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5880: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5890: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
58a0: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
58b0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
58c0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
58d0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
58e0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
58f0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
5900: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
5910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5920: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
5930: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
5940: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
5950: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
5960: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5970: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5980: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5990: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
59a0: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
59b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
59c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
59d0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
59e0: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
59f0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
5a00: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
5a10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5a20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
5a40: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5a50: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5a60: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
5a70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5a80: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5a90: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5aa0: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5ab0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5ac0: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
5ad0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
5ae0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
5af0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
5b00: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
5b10: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
5b20: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
5b50: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5b60: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
5b70: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5b80: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5b90: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5ba0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5bb0: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5bc0: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
5bd0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
5be0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
5bf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5c00: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
5c10: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
5c20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5c30: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5c40: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5c50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5c60: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5c70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5c80: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5c90: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5ca0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5cb0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5cc0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
5cd0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
5ce0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
5cf0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
5d00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d10: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5d20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5d30: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5d50: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5d70: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5d80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5d90: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5da0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5db0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5dc0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5dd0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5de0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5df0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5e10: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5e20: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5e30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5e40: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5e50: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5e60: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5e70: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5e80: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5e90: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5ea0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5eb0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5ec0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5ed0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5ee0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5ef0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5f00: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5f10: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5f20: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5f30: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5f40: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5f50: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5f60: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5f70: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5f80: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5fa0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5fb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5fc0: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5fd0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5fe0: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
5ff0: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6000: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
6010: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
6020: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
6030: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6040: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b    }..  rc = seek
6050: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6060: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
6070: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
6080: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
6090: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
60a0: 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
60b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
60c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
60d0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20  ger);..  /* FIX 
60e0: 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50  ME: .  **.  ** P
60f0: 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61  ossibly for a pa
6100: 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79  ger not in no-sy
6110: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
6120: 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c  rnal magic shoul
6130: 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72  d not.  ** be wr
6140: 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63  itten until nRec
6150: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73   is filled in as
6160: 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79   part of next sy
6170: 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20  ncJournal(). .  
6180: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
6190: 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65   maybe the whole
61a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
61b0: 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65  should be delaye
61c0: 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a  d until that.  *
61d0: 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61  * point. Think a
61e0: 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  bout this..  */.
61f0: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
6200: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6210: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6220: 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68  Magic));.  /* Th
6230: 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78  e nRec Field. 0x
6240: 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d  FFFFFFFF for no-
6250: 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  sync journals. *
6260: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6270: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6280: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
6290: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
62a0: 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b  0xffffffff : 0);
62b0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
62c0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
62d0: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
62e0: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
62f0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
6300: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
6310: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6320: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6330: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6340: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
6350: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6360: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
6370: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
6380: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
6390: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
63a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
63b0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
63c0: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
63d0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
63e0: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
63f0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
6400: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6410: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6420: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
6430: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54  ctorSize);.  IOT
6440: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
6450: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
6460: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
6470: 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48  alHdr, sizeof(zH
6480: 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20  eader))).  rc = 
6490: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
64a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
64b0: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
64c0: 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  der));..  /* The
64d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64e0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
64f0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
6500: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  eek the journal.
6510: 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
6520: 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ptor to the end 
6530: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
6540: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
6550: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
6560: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f  ITE_OK ){.    IO
6570: 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70  TRACE(("JTAIL %p
6580: 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
6590: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
65a0: 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20  lOff-1)).    rc 
65b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
65c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
65d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
65e0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
65f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6600: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6610: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6620: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6630: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6640: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6650: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6660: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6670: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6680: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6690: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
66a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
66b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
66c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
66d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
66e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
66f0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6700: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6710: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6720: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6730: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6740: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6750: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6760: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6770: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6780: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6790: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
67a0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
67b0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
67c0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
67d0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
67e0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
67f0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6800: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6810: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6820: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6830: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6840: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6850: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6860: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6870: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6880: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6890: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
68a0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
68b0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
68c0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
68d0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
68e0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
68f0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6900: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6910: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6920: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6940: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6960: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6970: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6980: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6990: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
69a0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
69b0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
69c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
69d0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
69e0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
69f0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6a00: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6a10: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6a20: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6a30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6a40: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6a50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6a60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6a70: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6a80: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6a90: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6aa0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
6ab0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
6ac0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
6ad0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
6ae0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6af0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6b00: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6b10: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6b20: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6b30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6b40: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6b50: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6b60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6b70: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6b80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6b90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6ba0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
6bb0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6bc0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6bd0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6be0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6bf0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6c00: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6c10: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6c20: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6c30: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6c40: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6c50: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6c60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6c70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6c80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6c90: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6ca0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
6cb0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
6cc0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6cd0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6ce0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6cf0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6d00: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6d10: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6d20: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6d30: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6d40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6d50: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6d60: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6d70: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6d80: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6d90: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6da0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6db0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
6dc0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
6dd0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6de0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6df0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6e00: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6e10: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6e20: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6e30: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6e40: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6e50: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6e60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6e70: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6e80: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6e90: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6ea0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6eb0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6ec0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6ed0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6ee0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6ef0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6f00: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6f10: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6f20: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6f30: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6f40: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6f50: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6f60: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6f70: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6f80: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6f90: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6fa0: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6fb0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6fc0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6fd0: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6fe0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6ff0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
7000: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
7010: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
7020: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
7030: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7040: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
7050: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
7060: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
7070: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
7080: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
7090: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
70a0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
70b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
70c0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
70d0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
70e0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
70f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
7100: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
7110: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
7120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
7130: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
7140: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
7150: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
7160: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
7170: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
7180: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
7190: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
71a0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
71b0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
71c0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
71d0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
71e0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
71f0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
7200: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
7210: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
7220: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
7230: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
7240: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
7250: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
7260: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
7270: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
7280: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7290: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
72a0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
72b0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
72c0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
72d0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
72e0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
72f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7300: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
7310: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
7320: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7340: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7350: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
7360: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
7370: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
7380: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
7390: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
73a0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
73b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
73c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
73d0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
73e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
73f0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
7400: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7410: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7420: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7430: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7440: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7450: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7460: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
7470: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7480: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7490: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
74a0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
74b0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
74c0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
74d0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
74e0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
74f0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
7500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7510: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7520: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7530: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7540: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7550: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7560: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7570: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7580: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7590: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
75a0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
75b0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
75c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
75d0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
75e0: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
75f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
7600: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
7610: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
7620: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
7630: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
7640: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
7650: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
7660: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
7670: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
7680: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
7690: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
76a0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
76b0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
76c0: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
76d0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
76e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
76f0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
7700: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
7710: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
7720: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
7730: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
7740: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
7750: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
7760: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
7770: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
7780: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
7790: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
77a0: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
77b0: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
77c0: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
77d0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
77e0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
77f0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
7800: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
7810: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7820: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7830: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
7840: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
7850: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
7860: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
7870: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
7880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7890: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
78a0: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
78b0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
78c0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
78d0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
78e0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
78f0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7900: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
7910: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
7920: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
7930: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
7940: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
7950: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
7960: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
7970: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
7980: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
7990: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
79a0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
79b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
79c0: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
79d0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
79e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
79f0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7a00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7a10: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7a20: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7a30: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7a40: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7a50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7a60: 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72  aHash==0 ) retur
7a70: 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65  n 0;.  p = pPage
7a80: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20  r->aHash[pgno & 
7a90: 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
7aa0: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
7ab0: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
7ac0: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
7ad0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
7ae0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7af0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7b00: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
7b10: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7b20: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
7b30: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
7b40: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
7b50: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mode ){.    if( 
7b60: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
7b70: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7b80: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7b90: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  OCK);.      pPag
7ba0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
7bb0: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
7bc0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
7bd0: 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20  Pager)).    }.  
7be0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7bf0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7c00: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
7c10: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
7c20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7c30: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
7c40: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
7c50: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
7c60: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
7c70: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
7c80: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
7c90: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
7ca0: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a  lready entered.*
7cb0: 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  * the error-stat
7cc0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7cd0: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
7ce0: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
7cf0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72  p){.  if( p->err
7d00: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7d10: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
7d20: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
7d30: 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  D || p->journalO
7d40: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pen==0 );.  if( 
7d50: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
7d60: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7d70: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
7d80: 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70  back(p);.  }.  p
7d90: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a  ager_unlock(p);.
7da0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
7db0: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72  Code || !p->jour
7dc0: 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65  nalOpen || (p->e
7dd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70  xclusiveMode&&!p
7de0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b  ->journalOff) );
7df0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
7e00: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d  rCode || !p->stm
7e10: 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c  tOpen || p->excl
7e20: 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a  usiveMode );.}..
7e30: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
7e40: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
7e50: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
7e60: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
7e70: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
7e80: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
7e90: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
7ea0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
7eb0: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
7ec0: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
7ed0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
7ee0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
7ef0: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
7f00: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
7f10: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
7f20: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
7f30: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
7f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7f50: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
7f60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
7f70: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
7f80: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
7f90: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
7fa0: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
7fb0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7fc0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
7fd0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
7fe0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
7ff0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
8000: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
8010: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8020: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
8030: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
8040: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
8050: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
8060: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
8070: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
8080: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
8090: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
80a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
80b0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
80c0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
80d0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
80e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
80f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8100: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
8110: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
8120: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
8130: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
8140: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
8150: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
8160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c  This routine rel
8170: 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  eases.** the dat
8180: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
8190: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
81a0: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
81b0: 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ce.  The journal
81c0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65  .** file is dele
81d0: 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a  ted and closed..
81e0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
81f0: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
8200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
8210: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
8220: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
8230: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
8240: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
8250: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
8260: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
8270: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
8280: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
8290: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
82a0: 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69   int pager_unwri
82b0: 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  telock(Pager *pP
82c0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
82d0: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
82e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
82f0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
8300: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8310: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
8320: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
8330: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
8350: 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
8360: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
8370: 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67  tmtOpen && !pPag
8380: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8390: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  e ){.    if( !pP
83a0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
83b0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
83c0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
83d0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
83e0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
83f0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  en = 0;.    }els
8400: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8410: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
8420: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
8430: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
8440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8450: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
8460: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8470: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
8480: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
8490: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
84a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
84b0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  k(pPager->jfd, 0
84c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
84d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
84e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
84f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
8500: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8520: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
8530: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8540: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
8550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8560: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
8570: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
8580: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
8590: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
85a0: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
85b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
85c0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
85d0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
85e0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
85f0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
8600: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
8610: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
8620: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8630: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
8640: 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52      pPg->alwaysR
8650: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66  ollback = 0;.#if
8660: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
8670: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
8680: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
8690: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
86a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
86b0: 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
86c0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
86d0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
86e0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
86f0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
8700: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
8710: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8720: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
8730: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
8740: 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
8750: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
8760: 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  0 );.  }.  if( !
8770: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8780: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  eMode ){.    rc 
8790: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
87a0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
87b0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
87c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
87d0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
87e0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
87f0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
8800: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
8810: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8820: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
8830: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
8840: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
8850: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8860: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8870: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
8880: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
8890: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
88a0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  irst;.  pPager->
88b0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
88c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
88d0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
88e0: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
88f0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8900: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8910: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8920: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8930: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8940: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8950: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8960: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8970: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8980: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8990: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
89a0: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
89b0: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
89c0: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
89d0: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
89e0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
89f0: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8a00: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8a10: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8a20: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8a30: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8a40: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8a50: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8a60: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8a70: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8a80: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8a90: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8aa0: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8ab0: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8ac0: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8ad0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8ae0: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8af0: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8b00: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8b10: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8b20: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8b30: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8b40: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8b50: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8b60: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
8b70: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
8b80: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
8b90: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
8ba0: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
8bb0: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
8bc0: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
8bd0: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
8be0: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
8bf0: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
8c00: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
8c10: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
8c20: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
8c30: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
8c40: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
8c50: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
8c60: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
8c70: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
8c80: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
8c90: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
8ca0: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
8cb0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
8cc0: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
8cd0: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
8ce0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8cf0: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
8d00: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
8d10: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
8d20: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
8d30: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
8d40: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8d50: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8d60: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8d70: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8d80: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8d90: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8da0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
8db0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
8dc0: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
8dd0: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
8de0: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
8df0: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
8e00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8e10: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
8e20: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
8e30: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
8e40: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
8e50: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
8e60: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
8e70: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
8e80: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
8e90: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
8ea0: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
8eb0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
8ec0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
8ed0: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
8ee0: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
8ef0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
8f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8f10: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
8f20: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
8f30: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
8f40: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
8f50: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
8f60: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8f80: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
8f90: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
8fa0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
8fd0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
8fe0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
8ff0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9010: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
9020: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
9030: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
9040: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
9050: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
9060: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
9070: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
9080: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
9090: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
90a0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
90b0: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
90c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
90d0: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
90e0: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
90f0: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9100: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
9110: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
9120: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
9130: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
9140: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
9150: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9160: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
9170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9180: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9190: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
91a0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
91b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
91c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
91d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
91e0: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
91f0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
9200: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
9210: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
9220: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
9230: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
9240: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
9250: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
9260: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
9270: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
9280: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
9290: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
92a0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
92b0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
92c0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
92d0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
92e0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
92f0: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
9300: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
9310: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
9320: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
9330: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
9340: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
9350: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
9360: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
9370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9380: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
9390: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
93a0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
93b0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
93c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
93d0: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
93e0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
93f0: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
9400: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9410: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
9420: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9430: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
9440: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
9450: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
9460: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
9470: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9480: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
9490: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
94a0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
94b0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
94c0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
94d0: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
94e0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
94f0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9500: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
9510: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
9520: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
9530: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
9540: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
9550: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
9560: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
9570: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
9580: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9590: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
95a0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
95b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
95c0: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
95d0: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
95e0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
95f0: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
9600: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
9610: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9620: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
9630: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
9640: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
9650: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
9660: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
9670: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
9680: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
9690: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
96a0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
96b0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
96c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
96d0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
96e0: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
96f0: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
9700: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9710: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
9720: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
9730: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
9740: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
9750: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
9760: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
9770: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
9780: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
9790: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
97a0: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
97b0: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
97c0: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
97d0: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e   contents are in
97e0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
97f0: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
9800: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20    Otherwise, if 
9810: 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  a full ROLLBACK 
9820: 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
9830: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9840: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c  rollback the ful
9850: 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20  l ROLLBACK will 
9860: 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20  not restore the 
9870: 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67  page to its orig
9880: 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  inal.  ** conten
9890: 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  t.  Two conditio
98a0: 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62  ns must be met b
98b0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
98c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
98d0: 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  ** files. (1) th
98e0: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
98f0: 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  be locked.  (2) 
9900: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
9910: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70   original.  ** p
9920: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69  age content is i
9930: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
9940: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
9950: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
9960: 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  t in.  ** cache 
9970: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61  or else it is ma
9980: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
9990: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
99a0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
99b0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
99c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
99d0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
99e0: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30  LUSIVE || pPg!=0
99f0: 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c   );.  TRACE3("PL
9a00: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
9a10: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
9a20: 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20  ager), pgno);.  
9a30: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
9a40: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
9a50: 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c  VE && (pPg==0 ||
9a60: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
9a70: 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0) ){.    rc = s
9a80: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
9a90: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
9aa0: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
9ab0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
9ac0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9ad0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9ae0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9af0: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
9b00: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9b10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9b20: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
9b30: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
9b40: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
9b50: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
9b60: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
9b70: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
9b80: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
9b90: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
9ba0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
9bb0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
9bc0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
9bd0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
9be0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
9bf0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
9c00: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
9c10: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
9c20: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
9c30: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
9c40: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
9c50: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
9c60: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
9c70: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
9c80: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
9c90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
9ca0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
9cb0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
9cc0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
9cd0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
9ce0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
9cf0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
9d00: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
9d10: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9d20: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
9d30: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9d40: 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20  or ){  /*** FIX 
9d50: 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73  ME:  Should this
9d60: 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a   be xReinit? ***
9d70: 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
9d80: 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
9d90: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9da0: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
9db0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
9dc0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
9dd0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
9de0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
9df0: 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31 28 70  dif.    CODEC1(p
9e00: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
9e10: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20  g->pgno, 3);..  
9e20: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
9e30: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
9e40: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
9e50: 6f 66 20 50 61 67 65 72 2e 69 43 68 61 6e 67 65  of Pager.iChange
9e60: 43 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  Count */.    if(
9e70: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
9e80: 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67    pPager->iChang
9e90: 65 43 6f 75 6e 74 20 3d 20 72 65 74 72 69 65 76  eCount = retriev
9ea0: 65 33 32 62 69 74 73 28 70 50 67 2c 20 32 34 29  e32bits(pPg, 24)
9eb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9ec0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9ed0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
9ee0: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
9ef0: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
9f00: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
9f10: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
9f20: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
9f30: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
9f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
9f50: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
9f60: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
9f70: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
9f80: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
9f90: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
9fa0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9fb0: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
9fc0: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
9fd0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
9fe0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
9ff0: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
a000: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
a010: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
a020: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
a030: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
a040: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
a050: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
a060: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
a070: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
a080: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
a090: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
a0a0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
a0b0: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
a0c0: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
a0d0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
a0e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a0f0: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
a100: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  r(const char *zM
a110: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
a120: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
a130: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c  pen = 0;.  OsFil
a140: 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20  e *master = 0;. 
a150: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
a160: 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
a170: 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
a180: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
a190: 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
a1a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
a1b0: 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
a1c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
a1d0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
a1e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a1f0: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
a200: 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72   case some other
a210: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
a220: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f   running this ro
a230: 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20  utine also. Not 
a240: 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f  that it makes to
a250: 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63  o much differenc
a260: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
a270: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
a280: 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d  Only(zMaster, &m
a290: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
a2a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a2b0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a2c0: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
a2d0: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
a2e0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61  te3OsFileSize(ma
a2f0: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
a300: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
a310: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a320: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a330: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
a340: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
a350: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
a360: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
a370: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
a380: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
a390: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
a3a0: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
a3b0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
a3c0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
a3d0: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
a3e0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
a3f0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
a400: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
a410: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
a420: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
a430: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
a440: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
a450: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
a460: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a470: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a480: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
a490: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a4a0: 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d  sRead(master, zM
a4b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
a4c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
a4d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a4e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
a4f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
a500: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
a510: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
a520: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
a530: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
a540: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
a550: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a560: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
a570: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
a580: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
a590: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
a5a0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
a5b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
a5c0: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
a5d0: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
a5e0: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
a5f0: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
a600: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
a610: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
a620: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
a630: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a640: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
a650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
a660: 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b  le *journal = 0;
a670: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
a680: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
a690: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
a6a0: 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a  nly(zJournal, &j
a6b0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
a6c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a6d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a6e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a6f0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
a700: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
a710: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f  MasterJournal(jo
a720: 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50  urnal, &zMasterP
a730: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
a740: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
a750: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
a760: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
a780: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a790: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a7a0: 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
a7b0: 50 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70  Ptr!=0 && strcmp
a7c0: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
a7d0: 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
a7e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
a7f0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a800: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
a810: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
a820: 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
a830: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a840: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a850: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
a860: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a880: 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
a890: 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f  l += (strlen(zJo
a8a0: 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d  urnal)+1);.    }
a8b0: 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65  .  }.  .  sqlite
a8c0: 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  3OsDelete(zMaste
a8d0: 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  r);..delmaster_o
a8e0: 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65  ut:.  if( zMaste
a8f0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
a900: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
a910: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20  erJournal);.  } 
a920: 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f   .  if( master_o
a930: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
a940: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
a950: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
a960: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a   rc;.}..#if 0./*
a970: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
a980: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
a990: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
a9a0: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
a9b0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
a9c0: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
a9d0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
a9e0: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
a9f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
aa00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
aa10: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
aa20: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
aa30: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
aa40: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
aa50: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
aa60: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
aa70: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
aa80: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
aa90: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
aaa0: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
aab0: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
aac0: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
aad0: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
aae0: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
aaf0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ab00: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
ab10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ab20: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
ab30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ab40: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
ab50: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
ab60: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
ab70: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66  {.    char *zBuf
ab80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
ab90: 70 61 63 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  pace;        /* 
aba0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
abb0: 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   one page */.   
abc0: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
abd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
abe0: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
abf0: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
ac00: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ac20: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
ac30: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ac40: 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67  ze*(i64)(pPg->pg
ac50: 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66  no-1));.      if
ac60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ac70: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ac80: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
ac90: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
aca0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
acb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
acc0: 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48   TRACE3("REFETCH
acd0: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
ace0: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
acf0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
ad00: 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
ad10: 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  k;.      CODEC1(
ad20: 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50  pPager, zBuf, pP
ad30: 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20  g->pgno, 2);.   
ad40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
ad50: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50  mset(zBuf, 0, pP
ad60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
ad70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ad80: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
ad90: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
ada0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
adb0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
adc0: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
add0: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
ade0: 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67  pPg), zBuf, pPag
adf0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
ae00: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ae10: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
ae20: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
ae30: 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61  einiter(pPg, pPa
ae40: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
ae50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae60: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
ae70: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
ae80: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
ae90: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
aea0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
aeb0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
aec0: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
aed0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
aee0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
aef0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
af00: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
af10: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
af20: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
af30: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
af40: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
af50: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
af60: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
af70: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
af80: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
af90: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
afa0: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
afb0: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
afc0: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
afd0: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
afe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
aff0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
b000: 4c 55 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75  LUSIVE );.  retu
b010: 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  rn sqlite3OsTrun
b020: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
b030: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b040: 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d  e*(i64)nPage);.}
b050: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
b060: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
b070: 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
b080: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b090: 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
b0a0: 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
b0b0: 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
b0c0: 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
b0d0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
b0e0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
b0f0: 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
b100: 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
b110: 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
b120: 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
b130: 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
b140: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b150: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b160: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
b170: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
b180: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
b190: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
b1a0: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
b1b0: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
b1c0: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
b1d0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
b1e0: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
b1f0: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
b200: 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
b210: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
b220: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
b230: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
b240: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
b250: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
b260: 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
b270: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b280: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b290: 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
b2a0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
b2b0: 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
b2c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
b2d0: 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74   (5)  4 byte int
b2e0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b2f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
b300: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
b310: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
b320: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
b330: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
b340: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
b350: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
b360: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
b370: 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79  .).**  (6)  N by
b380: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
b390: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
b3a0: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
b3b0: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
b3c0: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
b3d0: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
b3e0: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
b3f0: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
b400: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
b410: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
b420: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
b430: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
b440: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
b450: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
b460: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
b470: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
b480: 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72  -8..**  (7)  Zer
b490: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
b4a0: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
b4b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
b4c0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
b4d0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
b4e0: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
b4f0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
b500: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
b510: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
b520: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
b530: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
b540: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b550: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
b560: 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76  rst 6 items abov
b570: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
b580: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b590: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
b5a0: 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a  f the 7th item..
b5b0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
b5c0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
b5d0: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
b5e0: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
b5f0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
b600: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
b610: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b620: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
b630: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
b640: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
b650: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
b660: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b670: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
b680: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
b690: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
b6a0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
b6b0: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
b6c0: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
b6d0: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
b6e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b6f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
b700: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
b710: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
b720: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
b730: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
b740: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
b750: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
b760: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
b770: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
b780: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
b790: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
b7a0: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
b7b0: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
b7c0: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
b7d0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
b7e0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
b7f0: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
b800: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
b810: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
b820: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
b830: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
b840: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
b850: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
b860: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
b870: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
b880: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
b890: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
b8a0: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
b8b0: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
b8c0: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
b8d0: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
b8e0: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
b8f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
b900: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
b910: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
b920: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
b930: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
b940: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
b950: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
b960: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
b970: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
b980: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
b990: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
b9a0: 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
b9b0: 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
b9c0: 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
b9d0: 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
b9e0: 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
b9f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
ba00: 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
ba10: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
ba20: 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
ba30: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
ba40: 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
ba50: 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
ba60: 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
ba70: 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
ba80: 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
ba90: 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
baa0: 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
bab0: 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
bac0: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
bad0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
bae0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
baf0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
bb00: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
bb10: 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69   int isHot){.  i
bb20: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
bb30: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bb40: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bb50: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
bb60: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
bb70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bb80: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
bb90: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
bba0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bbc0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
bbd0: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
bbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bbf0: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
bc00: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
bc10: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc30: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
bc40: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
bc50: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
bc60: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
bc70: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
bc80: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
bc90: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
bca0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
bcb0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
bcc0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
bcd0: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
bce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
bcf0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
bd00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
bd10: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
bd20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
bd30: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
bd40: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
bd50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
bd60: 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
bd70: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
bd80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
bd90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
bda0: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
bdb0: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
bdc0: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
bdd0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
bde0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
bdf0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
be00: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
be10: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
be20: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
be30: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
be40: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
be50: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
be60: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
be70: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
be80: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
be90: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
bea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
beb0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
bec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bed0: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
bee0: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
bef0: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
bf00: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
bf10: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
bf20: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
bf30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bf40: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
bf50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
bf60: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
bf70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
bf80: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bf90: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
bfa0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
bfb0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
bfc0: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
bfd0: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
bfe0: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
bff0: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
c000: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
c010: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
c020: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
c030: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
c040: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
c050: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
c060: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
c070: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
c080: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
c090: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
c0a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
c0b0: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
c0c0: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
c0d0: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
c0e0: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
c0f0: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
c100: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
c110: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
c120: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
c130: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
c140: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
c150: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
c160: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
c170: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
c180: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
c190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
c1a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c1b0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c1c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c1d0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
c1e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c1f0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
c200: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
c210: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
c220: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
c230: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
c240: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
c250: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
c260: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
c270: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
c280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
c290: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
c2a0: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
c2b0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
c2c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
c2d0: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
c2e0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
c2f0: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
c300: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
c310: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
c320: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
c330: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c340: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
c350: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c360: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
c370: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
c380: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c390: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
c3a0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c3b0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
c3c0: 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
c3d0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
c3e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
c3f0: 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
c400: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20   ** process. In 
c410: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65  this case the re
c420: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
c430: 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  l file consists 
c440: 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  of.    ** journa
c450: 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70  lled copies of p
c460: 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
c470: 6f 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69  o be read back i
c480: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20  nto the cache.. 
c490: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
c4a0: 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
c4b0: 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
c4c0: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
c4d0: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
c4e0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c4f0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
c500: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
c510: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
c520: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
c530: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
c540: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
c550: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
c560: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
c570: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c580: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
c590: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
c5a0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
c5b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c5c0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
c5d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
c5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c5f0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
c600: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
c610: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
c620: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
c630: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
c640: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
c650: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c660: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
c670: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c680: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
c690: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
c6a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c6b0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
c6c0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
c6d0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
c6e0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
c6f0: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
c700: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
c710: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
c720: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
c730: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
c740: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
c750: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
c760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
c780: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c790: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
c7a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c7b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c7c0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
c7d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c7e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c7f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
c800: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
c810: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c820: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
c830: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
c840: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
c850: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
c860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c870: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
c880: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
c890: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
c8a0: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
c8b0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
c8c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
c8d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c8e0: 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20   return true,.  
c8f0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
c900: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c910: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c920: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
c930: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c950: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
c960: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
c970: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
c980: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
c990: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
c9a0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
c9b0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
c9c0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
c9d0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c9e0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c9f0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ca00: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
ca10: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
ca20: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
ca30: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
ca40: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
ca50: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
ca60: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
ca70: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
ca80: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
ca90: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
caa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cab0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
cac0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cad0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
cae0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
caf0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
cb00: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cb10: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
cb20: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
cb30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
cb40: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
cb50: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
cb60: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
cb70: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
cb80: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
cb90: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
cba0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
cbb0: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
cbc0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
cbd0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
cbe0: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
cbf0: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
cc00: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
cc10: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
cc20: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
cc30: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
cc40: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
cc50: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
cc60: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
cc70: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
cc80: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
cc90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
cca0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
ccb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ccc0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
ccd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cce0: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
ccf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
cd00: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
cd10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cd20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
cd30: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
cd40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
cd50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cd60: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
cd70: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
cd80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
cd90: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
cda0: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
cdb0: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
cdc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
cdd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
cde0: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
cdf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
ce00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
ce10: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
ce20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
ce30: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
ce40: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
ce50: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65  just after the e
ce60: 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a  nd of the last j
ce70: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  ournal.  ** page
ce80: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
ce90: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
cea0: 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69  l-header for thi
ceb0: 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  s statement.  **
cec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
ced0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65   written, or the
cee0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
cef0: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
cf00: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
cf10: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
cf20: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
cf30: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
cf40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
cf50: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
cf60: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
cf70: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
cf80: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
cf90: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
cfa0: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
cfb0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
cfc0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
cfd0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
cfe0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
cff0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d000: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d010: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
d020: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
d030: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d040: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d050: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d060: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
d070: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
d080: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
d090: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
d0a0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d0b0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
d0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d0d0: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
d0e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d0f0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
d100: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
d110: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
d120: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
d130: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
d140: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d150: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d160: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
d170: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
d180: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
d190: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
d1a0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
d1b0: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
d1c0: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
d1d0: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
d1e0: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
d1f0: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
d200: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
d210: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
d220: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
d230: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
d240: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d250: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d260: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d270: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
d280: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d290: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d2a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d2b0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d2c0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d2d0: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
d2e0: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
d2f0: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
d300: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
d310: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
d320: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
d330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d340: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
d350: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
d360: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
d370: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
d380: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d390: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
d3a0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d3b0: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
d3c0: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
d3d0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
d3e0: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
d3f0: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
d400: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
d410: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d420: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
d430: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
d440: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
d450: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d460: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d470: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d480: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d490: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
d4a0: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d4b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d4c0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d4d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
d4e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d4f0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
d500: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
d510: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
d520: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
d530: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d540: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d550: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
d560: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d570: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d580: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d590: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
d5a0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d5b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d5c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d5d0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d5e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
d5f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d600: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
d610: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
d620: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d630: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
d640: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
d650: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d660: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d670: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
d680: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
d690: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d6a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d6b0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d6c0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
d6d0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
d6f0: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
d700: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
d710: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d720: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
d730: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
d740: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
d750: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
d760: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d770: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
d780: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d790: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d7a0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d7b0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
d7c0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d7d0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
d7e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d7f0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d800: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d810: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
d820: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d830: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
d840: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
d850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
d860: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
d870: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
d880: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
d890: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
d8a0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
d8b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
d8c0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
d8d0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
d8e0: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
d8f0: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
d900: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
d910: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
d920: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d930: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
d940: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
d950: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d960: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
d970: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
d980: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
d990: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
d9a0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
d9b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
d9c0: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
d9d0: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
d9e0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
d9f0: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
da00: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
da10: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
da20: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
da30: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
da40: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
da50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
da60: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
da70: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
da80: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
da90: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
daa0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
dab0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
dac0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
dad0: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
dae0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
daf0: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
db00: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
db10: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
db20: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
db30: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
db40: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
db50: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
db70: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
db80: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
db90: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
dba0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dbb0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
dbc0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
dbd0: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
dbe0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
dbf0: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
dc00: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
dc10: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
dc20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
dc40: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
dc50: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
dc60: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
dc70: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
dc80: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
dc90: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dca0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dcb0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
dcc0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
dcd0: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
dce0: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
dcf0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
dd00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
dd10: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
dd20: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
dd30: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
dd40: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
dd50: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
dd60: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
dd70: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
dd80: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
dd90: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
dda0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
ddb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
ddc0: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
ddd0: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
dde0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
ddf0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
de00: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
de10: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
de20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
de30: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
de40: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
de50: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
de60: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
de70: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
de80: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
de90: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
dea0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
deb0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
dec0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ded0: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
dee0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
def0: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
df00: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
df10: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
df20: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
df30: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
df40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
df50: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
df60: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
df70: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
df80: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
df90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
dfa0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
dfb0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
dfc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
dfd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
dfe0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
dff0: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
e000: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
e010: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
e020: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e030: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
e040: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
e050: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
e060: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
e070: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
e080: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
e090: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e0a0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
e0b0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
e0c0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
e0d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
e0e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e0f0: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
e100: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e110: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
e120: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
e130: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
e140: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
e150: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e160: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
e170: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
e180: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
e190: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
e1a0: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
e1b0: 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a  (OsFile **pFd){.
e1c0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
e1d0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e1e0: 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
e1f0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69  PNAME_SIZE];..#i
e200: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e210: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
e220: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
e230: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e240: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e250: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
e260: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
e270: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
e280: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
e290: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e2a0: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e2b0: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
e2c0: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e2d0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e2e0: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e2f0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e300: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e310: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e320: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e330: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e340: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e350: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e360: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e370: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e380: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e390: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e3a0: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e3b0: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e3c0: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e3d0: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e3e0: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e3f0: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e400: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e410: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e420: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e430: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e440: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e450: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e460: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e470: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e480: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e490: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e4a0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e4b0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e4c0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e4d0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e4e0: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e4f0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e500: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e510: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e520: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e530: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e540: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e550: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
e560: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
e570: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e580: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
e590: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
e5a0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
e5b0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
e5c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e5d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
e5e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
e5f0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
e600: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
e610: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
e620: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
e630: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
e640: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
e650: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e670: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
e680: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
e690: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e6a0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
e6b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
e6c0: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
e6d0: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
e6e0: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
e6f0: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
e700: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
e710: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20  .  OsFile *fd;. 
e720: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e730: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
e740: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
e750: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
e760: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
e770: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
e780: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
e790: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
e7a0: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
e7b0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
e7c0: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
e7d0: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
e7e0: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
e7f0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
e800: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e810: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
e820: 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
e830: 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
e840: 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
e850: 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
e860: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
e870: 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
e880: 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
e890: 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
e8a0: 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
e8b0: 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
e8c0: 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
e8d0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
e8e0: 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
e8f0: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
e900: 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
e910: 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
e920: 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
e930: 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20  e set. It would 
e940: 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72  be nice to asser
e950: 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65  t.  ** that Thre
e960: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73  adData.nAlloc is
e970: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61   non-zero, but a
e980: 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20  las this breaks 
e990: 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a  test cases .  **
e9a0: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f   written to invo
e9b0: 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72  ke the pager dir
e9c0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68  ectly..  */.  Th
e9d0: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
e9e0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e9f0: 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
ea00: 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  pTsd );.#endif..
ea10: 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29    /* If malloc()
ea20: 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69   has already fai
ea30: 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  led return SQLIT
ea40: 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20  E_NOMEM. Before 
ea50: 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e  even.  ** testin
ea60: 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20  g for this, set 
ea70: 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c  *ppPager to NULL
ea80: 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b   so the caller k
ea90: 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20  nows the pager. 
eaa0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61   ** structure wa
eab0: 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65  s never allocate
eac0: 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61  d. .  */.  *ppPa
ead0: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
eae0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
eaf0: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
eb00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
eb10: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66  .  }.  memset(&f
eb20: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29  d, 0, sizeof(fd)
eb30: 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
eb40: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
eb50: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
eb60: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
eb70: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
eb80: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
eb90: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
eba0: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
ebb0: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
ebc0: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
ebd0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
ebe0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
ebf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ec00: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
ec10: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
ec20: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
ec30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
ec40: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
ec50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ec60: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
ec70: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
ec80: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
ec90: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
eca0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
ecb0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
ecc0: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
ecd0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
ece0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ecf0: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
ed00: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
ed10: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
ed20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ed30: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
ed40: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
ed50: 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71  emp(&fd);.    sq
ed60: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
ed70: 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ame(zTemp);.    
ed80: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
ed90: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
eda0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
edb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
edc0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
edd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ede0: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
edf0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
ee00: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
ee10: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
ee20: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
ee30: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
ee40: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
ee50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
ee60: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
ee70: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
ee80: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
ee90: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
eea0: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
eeb0: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
eec0: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
eed0: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
eee0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
eef0: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
ef00: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ef10: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
ef20: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
ef30: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
ef40: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20  n*3 + 30 );.    
ef50: 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63  if( pPager && rc
ef60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ef70: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
ef80: 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a  pSpace = (char *
ef90: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77  )sqliteMallocRaw
efa0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
efb0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
efc0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
efd0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
efe0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
eff0: 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
f000: 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  free the memory 
f010: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
f020: 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d   by zFullPathnam
f030: 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65  e, free the Page
f040: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
f050: 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  close the .  ** 
f060: 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20  file. Since the 
f070: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c  pager is not all
f080: 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20  ocated there is 
f090: 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a  no need to set .
f0a0: 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65    ** any Pager.e
f0b0: 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73  rrMask variables
f0c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
f0d0: 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61  ager || !zFullPa
f0e0: 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65  thname || !pPage
f0f0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20  r->pTmpSpace || 
f100: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f110: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
f120: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
f130: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f140: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
f150: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
f160: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
f170: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
f180: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
f190: 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50   }..  TRACE3("OP
f1a0: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
f1b0: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a  EHANDLEID(fd), z
f1c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f1d0: 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
f1e0: 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
f1f0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f200: 29 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ).  pPager->zFil
f210: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
f220: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
f230: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
f240: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
f250: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
f260: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
f270: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
f280: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
f290: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
f2a0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f2b0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
f2c0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f2d0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
f2e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  FullPathname);..
f2f0: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
f300: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
f310: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
f320: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
f330: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
f340: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f350: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
f360: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
f370: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
f380: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
f390: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f3a0: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
f3b0: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
f3c0: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
f3d0: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
f3e0: 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  d;.  /* pPager->
f3f0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
f400: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
f410: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
f420: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
f430: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
f440: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
f450: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
f460: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f470: 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
f480: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
f490: 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
f4a0: 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
f4b0: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f4c0: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
f4d0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
f4e0: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
f4f0: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
f500: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
f510: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
f520: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f530: 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
f540: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
f550: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f560: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
f570: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f580: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
f590: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
f5a0: 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f  UNLOCK==0 );.  /
f5b0: 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
f5c0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
f5d0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f5e0: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
f5f0: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
f600: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
f610: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
f620: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
f630: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
f640: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
f650: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
f660: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f670: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
f680: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
f690: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
f6a0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
f6b0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
f6c0: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
f6d0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
f6e0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
f6f0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
f700: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
f710: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
f720: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
f730: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
f740: 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
f750: 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20  t(fd||memDb);.  
f760: 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
f770: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
f780: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
f790: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
f7a0: 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
f7b0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
f7c0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
f7d0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
f7e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
f7f0: 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
f800: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
f810: 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
f820: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
f830: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
f840: 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73  ger->pNext = pTs
f850: 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73  d->pPager;.  pTs
f860: 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
f870: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  er;.#endif.  ret
f880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f890: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f8a0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
f8b0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
f8c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
f8d0: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
f8e0: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
f8f0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
f900: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
f910: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
f920: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
f930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
f940: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
f950: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
f960: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
f970: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
f980: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
f990: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
f9a0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
f9b0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
f9c0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
f9d0: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
f9e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
f9f0: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
fa00: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
fa10: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
fa20: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
fa30: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
fa40: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50   result sqlite3P
fa50: 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a  agerClose().  .*
fa60: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
fa70: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
fa80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
fa90: 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
faa0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
fab0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
fac0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
fad0: 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  esc)(DbPage*,int
fae0: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
faf0: 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
fb00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
fb10: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
fb20: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
fb30: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
fb40: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
fb50: 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
fb60: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
fb70: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
fb80: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
fb90: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
fba0: 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
fbb0: 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
fbc0: 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
fbd0: 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
fbe0: 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
fbf0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
fc00: 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
fc10: 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
fc20: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
fc30: 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
fc40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fc50: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
fc60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fc70: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
fc80: 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
fc90: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
fca0: 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
fcb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
fcc0: 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72  age size.  Retur
fcd0: 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20  n the new size. 
fce0: 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
fcf0: 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  new page.** size
fd00: 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74   is inappropriat
fd10: 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
fd20: 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
fd30: 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20   is selected.** 
fd40: 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  and returned..*/
fd50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
fd60: 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
fd70: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
fd80: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
fd90: 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
fda0: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
fdb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
fdc0: 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70  SIZE );.  if( !p
fdd0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
fde0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
fdf0: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
fe00: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 61 6c  .    sqlite3Real
fe10: 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69 64 20  locOrFree((void 
fe20: 2a 2a 29 26 70 50 61 67 65 72 2d 3e 70 54 6d 70  **)&pPager->pTmp
fe30: 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29  Space, pageSize)
fe40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
fe50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fe60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
fe70: 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
fe80: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
fe90: 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
fea0: 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
feb0: 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
fec0: 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
fed0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
fee0: 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
fef0: 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
ff00: 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
ff10: 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
ff20: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
ff30: 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
ff40: 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
ff50: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
ff60: 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
ff70: 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
ff80: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
ff90: 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
ffa0: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
ffb0: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
ffc0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
ffd0: 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
ffe0: 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
fff0: 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73  nt;.void clear_s
10000 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10010 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  r(){.  sqlite3_i
10020 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b  o_error_hit = 0;
10030 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  .}.void disable_
10040 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10050 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
10060 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
10070 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10080 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
10090 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
100a0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
100b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
100c0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
100d0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
100e0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
100f0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
10100 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75  efine clear_simu
10110 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
10120 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
10130 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10140 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
10150 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
10160 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
10170 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
10180 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
10190 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
101a0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
101b0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
101c0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
101d0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
101e0 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
101f0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
10200 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
10210 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
10220 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
10230 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
10240 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
10250 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
10260 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
10270 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
10280 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
10290 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
102a0 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
102b0 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
102c0 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
102d0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
102e0 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
102f0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
10300 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
10310 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
10320 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
10330 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
10340 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
10350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
10360 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
10370 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10380 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
10390 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
103a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
103b0 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
103c0 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
103d0 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
103e0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
103f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
10400 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
10410 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
10420 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
10430 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10440 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  s();.    IOTRACE
10450 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
10460 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
10470 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10480 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
10490 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
104a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
104b0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
104c0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
104d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
104e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
104f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
10500 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
10510 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
10520 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
10530 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
10540 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
10550 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
10560 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
10570 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
10580 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
10590 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
105a0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
105b0 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
105c0 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
105d0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
105e0 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
105f0 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
10600 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
10610 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
10620 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
10630 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
10640 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
10650 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
10660 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10670 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
10680 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
10690 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
106a0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
106b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
106c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
106d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
106e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
106f0 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  =0 ){.    n = pP
10700 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
10710 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28  } else {.    if(
10720 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
10730 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10740 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
10750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
10760 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
10770 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
10780 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
10790 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
107a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
107b0 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
107c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107d0 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
107e0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
107f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
10800 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
10810 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10820 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
10830 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
10840 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
10850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
10860 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
10870 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10880 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10890 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
108a0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
108b0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
108c0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
108d0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
108e0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
108f0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10900 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
10910 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
10920 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
10930 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
10940 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
10950 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
10960 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
10970 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
10980 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
10990 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
109a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
109b0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
109c0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
109d0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
109e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
109f0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
10a00 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
10a10 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
10a20 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
10a30 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
10a40 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
10a50 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
10a60 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
10a70 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
10a80 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
10a90 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10aa0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10ab0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10ac0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10ad0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
10ae0 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
10af0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
10b00 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
10b10 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
10b20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
10b30 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
10b40 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
10b50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
10b60 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
10b70 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
10b80 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
10b90 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
10ba0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
10bb0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
10bc0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
10bd0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
10be0 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
10bf0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
10c00 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
10c10 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
10c20 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
10c30 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
10c40 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
10c50 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
10c60 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
10c70 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
10c80 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10c90 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
10ca0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
10cb0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
10cc0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
10cd0 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
10ce0 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
10cf0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
10d00 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
10d10 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
10d20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10d30 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
10d40 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
10d50 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
10d60 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
10d70 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
10d80 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
10d90 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
10da0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
10db0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
10dc0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
10dd0 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
10de0 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
10df0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
10e00 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
10e10 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
10e20 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
10e30 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
10e40 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
10e50 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
10e60 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
10e70 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
10e80 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
10e90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
10ea0 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
10eb0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
10ec0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
10ed0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
10ee0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
10ef0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
10f00 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
10f10 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
10f20 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10f30 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
10f40 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
10f50 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
10f60 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10f70 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
10f80 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
10f90 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
10fa0 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
10fb0 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
10fc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10fd0 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
10fe0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10ff0 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
11000 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
11010 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
11020 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
11030 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
11040 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
11050 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
11060 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
11070 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23  ager, pPg);.}..#
11080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11090 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
110a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
110b0 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
110c0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
110d0 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
110e0 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
110f0 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
11100 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
11110 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
11120 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
11130 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
11140 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
11150 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
11160 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
11170 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
11180 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11190 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
111a0 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
111b0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
111c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
111d0 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
111e0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
111f0 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
11200 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
11210 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
11220 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
11230 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
11240 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
11250 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
11260 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
11270 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11280 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
11290 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
112a0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
112b0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
112c0 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
112d0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
112e0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
112f0 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
11300 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
11310 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
11320 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
11330 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
11340 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
11350 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
11360 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  p).#endif../*.**
11370 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
11380 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
11390 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
113a0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
113b0 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
113c0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
113d0 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
113e0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
113f0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
11400 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
11410 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
11420 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
11430 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
11440 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
11450 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
11460 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
11470 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
11480 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
11490 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
114a0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
114b0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
114c0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
114d0 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
114e0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
114f0 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
11500 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
11510 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
11520 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11530 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
11540 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
11550 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
11560 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
11570 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
11580 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
11590 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
115a0 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
115b0 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
115c0 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
115d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
115e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
115f0 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
11600 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44  dbSize<0 || MEMD
11610 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  B );..  if( pPag
11620 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
11630 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
11640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
11650 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
11660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11670 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
11680 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
11690 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
116a0 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
116b0 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
116c0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
116d0 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
116e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
116f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
11700 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
11710 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
11720 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
11730 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
11740 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
11750 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11760 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
11770 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
11780 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11790 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
117a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
117b0 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
117c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
117d0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
117e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
117f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11800 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
11810 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
11820 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
11830 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11840 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
11850 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
11860 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
11870 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
11880 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
11890 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
118a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
118b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
118c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
118d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
118e0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
118f0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
11900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
11920 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
11930 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
11940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11960 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
11970 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
11980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
11990 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
119a0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
119b0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
119c0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
119d0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
119e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
119f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11a00 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
11a10 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
11a20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
11a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11a40 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
11a50 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
11a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11a70 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
11a80 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
11a90 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
11aa0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
11ab0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
11ac0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
11ad0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
11ae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11af0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
11b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
11b10 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
11b20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
11b30 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
11b40 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
11b50 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
11b60 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
11b70 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
11b80 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
11b90 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
11ba0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
11bb0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
11bc0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
11bd0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
11be0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
11bf0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
11c00 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
11c10 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
11c20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
11c30 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
11c40 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
11c50 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11c60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
11c70 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
11c80 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
11c90 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
11ca0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
11cb0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
11cc0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
11cd0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
11ce0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
11cf0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11d00 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
11d10 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
11d20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
11d30 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
11d40 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
11d50 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
11d60 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
11d70 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
11d80 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
11d90 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
11da0 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
11db0 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
11dc0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
11dd0 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
11de0 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
11df0 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
11e00 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
11e10 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
11e20 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68  e set..  */.  Th
11e30 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
11e40 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
11e50 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
11e60 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
11e70 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64  rt( pTsd && pTsd
11e80 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64  ->nAlloc );.#end
11e90 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
11ea0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11eb0 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
11ec0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
11ed0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
11ee0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
11ef0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
11f00 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
11f10 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
11f20 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
11f30 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
11f40 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  ;.  TRACE2("CLOS
11f50 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
11f60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
11f70 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
11f80 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61  n", pPager)).  a
11f90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11fa0 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65  rrCode || (pPage
11fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
11fc0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d  0 && pPager->stm
11fd0 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  tOpen==0) );.  i
11fe0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
11ff0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
12000 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
12010 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
12020 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12030 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
12040 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12050 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
12060 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
12070 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
12080 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c   }.  sqlite3OsCl
12090 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
120a0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
120b0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
120c0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
120d0 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
120e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
120f0 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
12100 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
12110 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
12120 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65  ** }.  */..#ifde
12130 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12140 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
12150 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  T.  /* Remove th
12160 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65  e pager from the
12170 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
12180 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20  pagers starting 
12190 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  at .  ** ThreadD
121a0 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65  ata.pPager if me
121b0 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
121c0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f  is enabled..  */
121d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70  .  if( pPager==p
121e0 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  Tsd->pPager ){. 
121f0 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20     pTsd->pPager 
12200 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
12210 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
12220 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66  ger *pTmp;.    f
12230 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e  or(pTmp = pTsd->
12240 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e  pPager; pTmp->pN
12250 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d  ext!=pPager; pTm
12260 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d  p=pTmp->pNext){}
12270 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74  .    pTmp->pNext
12280 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
12290 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
122a0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
122b0 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
122c0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  teFree(pPager->p
122d0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
122e0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
122f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12300 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
12310 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
12320 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
12330 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
12340 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
12350 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
12360 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
12370 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
12380 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
12390 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
123a0 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
123b0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
123c0 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
123d0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
123e0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
123f0 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
12400 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
12410 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
12420 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
12430 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
12440 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
12450 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
12460 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
12470 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
12480 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
12490 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
124a0 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
124b0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
124c0 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
124d0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
124e0 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
124f0 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
12500 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
12510 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
12520 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
12530 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
12540 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
12550 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
12560 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
12570 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
12580 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
12590 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
125a0 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
125b0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
125c0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
125d0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
125e0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
125f0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
12600 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
12610 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12620 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
12630 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
12640 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
12650 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
12660 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
12670 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
12680 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
126a0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
126b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
126c0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
126d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
126e0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
126f0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
12700 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
12710 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12720 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
12730 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
12740 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12750 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
12760 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
12770 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
12780 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12790 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
127a0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
127b0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
127c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
127d0 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
127e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
127f0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
12800 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
12810 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
12820 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
12830 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
12840 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
12850 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
12860 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
12870 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
12880 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12890 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
128a0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
128b0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
128c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
128d0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
128e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
128f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
12900 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
12910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12920 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
12930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12940 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
12950 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
12960 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
12970 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
12980 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
12990 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
129a0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
129b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
129c0 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
129d0 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
129e0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
129f0 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
12a00 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
12a10 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
12a20 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
12a30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
12a40 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
12a50 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
12a60 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
12a70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
12a80 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
12a90 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
12aa0 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
12ab0 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
12ac0 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
12ad0 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
12ae0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
12af0 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
12b00 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
12b10 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
12b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
12b30 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
12b40 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
12b50 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
12b60 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
12b70 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
12b80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
12b90 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
12ba0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12bb0 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
12bc0 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
12bd0 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
12be0 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
12bf0 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
12c00 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
12c10 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
12c20 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
12c30 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
12c40 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
12c50 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
12c60 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
12c70 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
12c80 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
12c90 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
12ca0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
12cb0 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12cc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12cd0 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
12ce0 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
12cf0 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
12d00 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
12d10 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
12d20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
12d30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
12d40 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
12d50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12d60 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
12d70 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
12d80 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
12d90 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
12da0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
12db0 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
12dc0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
12dd0 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
12de0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
12df0 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
12e00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
12e10 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
12e20 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12e30 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
12e40 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
12e50 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
12e60 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
12e70 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
12e80 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
12e90 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
12ea0 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
12eb0 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
12ec0 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
12ed0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12ee0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
12ef0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
12f00 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
12f10 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
12f20 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
12f30 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
12f40 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
12f50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
12f70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12f80 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20    i64 jSz;.     
12f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12fa0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
12fb0 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
12fc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
12fd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
12ff0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13000 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
13010 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
13020 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
13030 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
13040 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
13050 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
13060 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
13070 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
13080 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
13090 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
130a0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
130b0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
130c0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
130d0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
130e0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
130f0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
13100 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
13110 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
13120 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ack. .        */
13130 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
13140 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
13150 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
13160 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
13170 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
13180 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
13190 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
131a0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
131b0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
131c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
131d0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
131e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
131f0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13200 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13210 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13220 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
13230 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20  ->jfd,.         
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13260 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
13270 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
13280 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
13290 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
132a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
132b0 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
132c0 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20   pPager,.       
132d0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
132e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
132f0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
13300 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20 20 20  agic), 4)).     
13310 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
13320 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
13330 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
13340 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
13350 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
13360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13370 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13380 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
13390 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
133a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
133b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
133c0 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43      TRACE2("SYNC
133d0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
133e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
133f0 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
13400 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22  CE(("JSYNC %d\n"
13410 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
13420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13430 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
13440 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
13450 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
13460 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13470 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
13480 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13490 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
134a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
134b0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
134c0 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
134d0 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
134e0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
134f0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13500 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13510 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13520 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
13530 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
13540 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
13550 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
13560 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
13570 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13580 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
13590 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
135a0 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
135b0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
135c0 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
135d0 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
135e0 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
135f0 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
13600 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
13610 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
13620 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
13630 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
13640 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
13650 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
13660 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
13670 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
13680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13690 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
136a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
136b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
136c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
136d0 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
136e0 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
136f0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13700 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
13710 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
13720 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
13730 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
13740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
13750 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
13760 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
13770 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
13780 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
13790 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
137a0 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
137b0 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
137c0 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
137d0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
137e0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
137f0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
13800 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
13810 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
13820 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
13830 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13840 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
13850 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
13860 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
13870 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
13880 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13890 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
138a0 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
138b0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
138c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
138d0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
138e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
138f0 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
13900 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
13910 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
13920 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
13930 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
13940 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
13950 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
13960 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
13970 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
13980 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
13990 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
139a0 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
139b0 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20 50 67  KET 25.static Pg
139c0 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
139d0 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
139e0 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
139f0 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20  T_BUCKET], *p;. 
13a00 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13a10 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13a20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13a30 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13a40 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13a50 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13a60 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
13a70 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
13a80 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
13a90 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
13aa0 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
13ab0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
13ac0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
13ad0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
13ae0 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
13af0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
13b00 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
13b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13b20 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
13b30 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   ){.      a[i] =
13b40 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13b50 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
13b60 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
13b70 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
13b80 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
13b90 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
13ba0 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
13bb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13bc0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
13bd0 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
13be0 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
13bf0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
13c00 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
13c10 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
13c20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
13c30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13c40 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
13c50 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
13c60 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
13c70 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
13c80 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
13c90 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
13ca0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
13cb0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
13cc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13cd0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
13ce0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
13cf0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
13d00 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
13d10 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
13d20 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
13d30 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
13d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
13d50 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
13d60 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
13d70 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
13d80 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
13d90 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
13da0 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
13db0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
13dc0 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
13dd0 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
13de0 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
13df0 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
13e00 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
13e10 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
13e20 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
13e30 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
13e40 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
13e50 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
13e60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13e70 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
13e80 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
13e90 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
13ea0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
13eb0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
13ec0 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
13ed0 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
13ee0 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
13ef0 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
13f00 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
13f10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
13f20 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
13f30 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
13f40 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
13f50 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
13f60 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
13f70 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
13f80 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
13f90 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
13fa0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
13fb0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
13fc0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
13fd0 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
13fe0 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
13ff0 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
14000 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
14010 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
14020 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
14030 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
14040 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
14050 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
14060 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
14070 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14080 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14090 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
140a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
140b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
140c0 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
140d0 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
140e0 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
140f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14100 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
14110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14120 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
14130 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
14140 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
14150 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
14160 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14170 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
14180 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14190 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
141a0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
141b0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
141c0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
141d0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
141e0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
141f0 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
14200 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
14210 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
14220 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
14230 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
14240 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
14250 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
14260 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
14270 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14280 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14290 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
142a0 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
142b0 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
142c0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
142d0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
142e0 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
142f0 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f       TRACE3("STO
14300 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
14310 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14320 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
14330 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
14340 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
14350 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e   pPager, pList->
14360 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20  pgno)).      rc 
14370 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
14380 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
14390 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
143a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53  Size);.      TES
143b0 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
143c0 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Write);.    }.#i
143d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
143e0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41   else{.      TRA
143f0 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
14400 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
14410 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
14420 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
14430 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
14440 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14450 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
14460 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
14470 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14480 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
14490 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
144a0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
144b0 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
144c0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
144d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
144e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
144f0 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
14500 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
14510 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
14520 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
14530 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
14540 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
14550 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
14560 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
14570 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
14580 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14590 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
145a0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
145b0 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
145c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
145d0 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
145e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
145f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
14600 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
14610 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
14620 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
14630 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
14640 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
14650 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14660 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
14670 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14680 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
14690 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
146a0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
146b0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
146c0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
146d0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
146e0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
146f0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
14700 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
14710 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
14720 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
14730 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
14740 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
14750 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
14760 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14770 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
14780 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
14790 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20  urnal) ) return 
147a0 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
147b0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
147c0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
147d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
147e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
147f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
14800 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14810 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14820 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
14830 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14840 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
14850 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14860 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
14870 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
14880 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
14890 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
148a0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
148b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
148c0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
148d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
148e0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
148f0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
14900 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
14910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
14920 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
14930 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
14940 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
14950 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
14960 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
14970 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
14980 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
14990 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
149a0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
149b0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
149c0 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
149d0 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
149e0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
149f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14a00 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
14a10 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
14a20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
14a30 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
14a40 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
14a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14a60 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
14a70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
14a80 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
14a90 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
14aa0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
14ab0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
14ac0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
14ad0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
14ae0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
14af0 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
14b00 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
14b10 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
14b20 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
14b30 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
14b40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
14b50 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
14b60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14b70 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
14b80 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
14b90 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
14ba0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
14bb0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
14bc0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
14bd0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
14be0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
14bf0 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
14c00 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
14c10 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
14c20 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
14c30 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
14c40 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
14c50 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
14c60 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
14c70 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
14c80 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
14c90 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
14ca0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
14cb0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14cc0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
14cd0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
14ce0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
14cf0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
14d10 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14d20 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
14d30 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
14d40 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
14d50 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
14d60 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
14d70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
14d80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
14d90 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
14da0 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
14db0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
14dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14dd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
14de0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
14df0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
14e00 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
14e10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14e20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
14e30 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
14e40 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  dirty ){.    int
14e50 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
14e60 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
14e70 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  0 );.    makeCle
14e80 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
14e90 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
14ea0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
14eb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14ec0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
14ed0 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20   pPg );.    if( 
14ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
14f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
14f10 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
14f20 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
14f30 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
14f40 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
14f50 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
14f60 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
14f70 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
14f80 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
14f90 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
14fa0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
14fb0 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
14fc0 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
14fd0 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
14fe0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
14ff0 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
15000 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
15010 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
15020 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
15030 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
15040 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
15050 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
15060 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
15070 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
15080 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
15090 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
150a0 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
150b0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
150c0 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
150d0 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
150e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
150f0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
15100 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
15110 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
15120 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
15130 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20  ALWAYS_ROLLBACK 
15140 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
15150 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
15160 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
15170 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
15180 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
15190 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
151a0 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
151b0 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
151c0 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45  kPage(pPg);.  TE
151d0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
151e0 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67  nOvfl);..  *ppPg
151f0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
15200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15210 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15220 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
15230 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
15240 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
15250 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
15260 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
15270 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
15280 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
15290 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
152a0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
152b0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
152c0 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72 65  may be sqliteFre
152d0 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
152e0 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
152f0 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
15300 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
15310 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
15320 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
15330 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
15340 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69  eturns. A negati
15350 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65  ve value for nRe
15360 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20  q means.** free 
15370 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
15380 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20  s possible. The 
15390 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
153a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
153b0 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
153c0 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
153d0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
153e0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
153f0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20  _MANAGEMENT.int 
15400 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
15410 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
15420 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
15430 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
15440 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
15450 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
15460 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
15470 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
15480 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
15490 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
154a0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
154b0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
154c0 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
154d0 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
154e0 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
154f0 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
15500 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
15510 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
15520 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
15530 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
15540 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
15550 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
15560 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
15570 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
15580 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
15590 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
155a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
155b0 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
155c0 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
155d0 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
155e0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
155f0 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
15600 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
15610 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
15620 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
15630 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
15640 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
15650 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
15660 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
15670 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
15680 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
15690 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
156a0 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
156b0 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
156c0 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
156d0 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
156e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
156f0 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
15700 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
15710 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
15720 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
15730 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
15740 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
15750 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
15760 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
15770 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
15780 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
15790 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
157a0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
157b0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
157c0 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
157d0 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
157e0 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
157f0 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
15800 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
15810 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
15820 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
15830 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
15840 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
15850 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
15860 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
15870 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
15880 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
15890 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
158a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
158b0 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
158c0 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
158d0 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
158e0 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
158f0 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
15900 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
15910 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
15920 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
15930 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
15940 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
15950 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
15960 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
15970 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
15980 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
15990 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
159a0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
159b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
159c0 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
159d0 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
159e0 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
159f0 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
15a00 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
15a10 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
15a20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15a30 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
15a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15a50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
15a60 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
15a70 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15a80 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
15a90 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
15aa0 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
15ab0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
15ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ad0 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
15ae0 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
15af0 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
15b00 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
15b10 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
15b20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
15b30 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
15b40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15b50 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
15b60 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
15b70 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pPg);.        sq
15b80 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
15b90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
15ba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15bb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
15bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
15bd0 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
15be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bf0 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  le or .        *
15c00 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
15c10 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
15c20 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
15c30 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
15c40 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
15c50 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
15c60 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
15c70 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
15c80 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
15c90 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
15ca0 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
15cb0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
15cc0 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
15cd0 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a   case .        *
15ce0 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
15cf0 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
15d00 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
15d10 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
15d20 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
15d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d40 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
15d50 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53  E_IOERR || rc==S
15d60 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20  QLITE_FULL );.  
15d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15d80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
15d90 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
15da0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c    pager_error(p,
15db0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
15dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15dd0 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
15de0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15df0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
15e00 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
15e10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15e20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
15e30 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
15e40 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
15e50 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
15e60 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
15e70 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
15e80 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
15e90 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
15ea0 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
15eb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15ec0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
15ed0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
15ee0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
15ef0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
15f00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15f10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
15f20 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
15f30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   ){.    if( !MEM
15f40 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  DB ){.      asse
15f50 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
15f60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
15f70 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
15f80 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
15f90 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
15fa0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
15fb0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
15fc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15fe0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
15ff0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16000 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
16010 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16020 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
16030 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
16040 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
16050 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
16060 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
16070 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
16080 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
16090 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
160a0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
160b0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
160c0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
160d0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20  r deleted..     
160e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61   */.      if( ha
160f0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
16100 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  er) ){.        /
16110 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
16120 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
16130 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
16140 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
16150 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  s.        ** imp
16160 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
16170 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16180 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
16190 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
161a0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
161b0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
161c0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
161d0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
161e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
161f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
16200 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
16210 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
16220 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
16230 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
16240 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
16250 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
16260 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
16270 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
16280 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
16290 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
162a0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
162b0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
162c0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
162d0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
162e0 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
162f0 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
16300 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
16310 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
16320 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  fail to.        
16330 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
16340 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
16350 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16360 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  e file..        
16370 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
16380 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
16390 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
163a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
163b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
163c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
163d0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
163e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
163f0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16400 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16420 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
16430 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
16440 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  IVE;. .        /
16450 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
16460 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
16470 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
16480 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
16490 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
164a0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
164b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
164c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
164d0 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
164e0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
164f0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
16500 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
16510 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
16520 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
16530 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  open unless the 
16540 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
16550 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20  le holds.       
16560 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
16570 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
16580 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
16590 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
165a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
165b0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
165c0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
165d0 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
165e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
165f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
16600 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
16610 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
16620 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
16630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
16650 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
16660 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
16670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
16680 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
16690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
166a0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
166b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
166c0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
166d0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
166e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
166f0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
16700 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
16710 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16720 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
16730 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
16740 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
16750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
16760 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
16770 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
16780 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
16790 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
167a0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
167b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
167c0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
167d0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
167e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
167f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16800 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16810 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16830 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
16840 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
16850 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
16860 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
16870 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
16880 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
16890 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
168a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
168b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
168c0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
168d0 50 67 48 64 72 20 2a 70 50 61 67 65 31 20 3d 20  PgHdr *pPage1 = 
168e0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
168f0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
16900 20 69 66 28 20 70 50 61 67 65 31 20 29 7b 0a 20   if( pPage1 ){. 
16910 20 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 48           unlinkH
16920 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
16930 20 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20   pPage1);.      
16940 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 73 73    }..        ass
16950 65 72 74 28 20 21 70 61 67 65 72 5f 6c 6f 6f 6b  ert( !pager_look
16960 75 70 28 70 50 61 67 65 72 2c 20 31 29 20 29 3b  up(pPager, 1) );
16970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16980 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
16990 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  e(pPager, 1, &pP
169a0 61 67 65 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  age1, 0);.      
169b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
169c0 5f 4f 4b 20 29 7b 0a 09 20 20 2f 2a 20 54 68 65  _OK ){..  /* The
169d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
169e0 69 73 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  is stored at off
169f0 73 65 74 20 32 34 2e 20 53 65 65 20 61 6c 73 6f  set 24. See also
16a00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
16a10 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
16a20 6f 75 6e 74 65 72 28 29 2e 0a 20 20 20 20 20 20  ounter()..      
16a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
16a40 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f 75 6e   u32 iChangeCoun
16a50 74 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  t = retrieve32bi
16a60 74 73 28 70 50 61 67 65 31 2c 20 32 34 29 3b 0a  ts(pPage1, 24);.
16a70 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16a80 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
16a90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16aa0 55 6e 72 65 66 28 70 50 61 67 65 31 29 3b 0a 20  Unref(pPage1);. 
16ab0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16ac0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 20  >nRef--;.       
16ad0 20 20 20 69 66 28 20 69 43 68 61 6e 67 65 43 6f     if( iChangeCo
16ae0 75 6e 74 21 3d 70 50 61 67 65 72 2d 3e 69 43 68  unt!=pPager->iCh
16af0 61 6e 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  angeCount ){.   
16b00 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
16b10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
16b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16b30 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61      pPager->iCha
16b40 6e 67 65 43 6f 75 6e 74 20 3d 20 69 43 68 61 6e  ngeCount = iChan
16b50 67 65 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  geCount;.       
16b60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16b80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
16b90 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
16ba0 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
16bb0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
16bc0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
16bd0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
16be0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16bf0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
16c00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
16c10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16c20 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
16c30 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
16c40 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
16c50 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
16c60 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
16c70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
16c80 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
16c90 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
16ca0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
16cb0 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
16cc0 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
16cd0 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
16ce0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
16cf0 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
16d00 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
16d10 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
16d20 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
16d30 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
16d40 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
16d50 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
16d60 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
16d70 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
16d80 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
16d90 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
16da0 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
16db0 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
16dc0 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
16dd0 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
16de0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
16df0 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
16e00 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
16e10 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
16e20 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
16e30 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
16e40 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
16e50 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
16e60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
16e70 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
16e80 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
16e90 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
16ea0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
16eb0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
16ec0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
16ed0 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
16ee0 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
16ef0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
16f00 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
16f10 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
16f20 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
16f30 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
16f40 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
16f50 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
16f60 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
16f70 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
16f80 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
16f90 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
16fa0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
16fb0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
16fc0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
16fd0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
16fe0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
16ff0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
17000 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
17010 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
17020 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
17030 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
17040 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
17050 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
17060 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72  es..**.** If clr
17070 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 20 74  Flag is false, t
17080 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
17090 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65   are actually re
170a0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
170b0 20 49 66 20 63 6c 66 46 6c 61 67 20 69 73 20 74   If clfFlag is t
170c0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
170d0 65 20 70 61 67 65 20 69 73 20 61 62 6f 75 74 20  e page is about 
170e0 74 6f 20 62 65 20 65 72 61 73 65 64 20 61 6e 64  to be erased and
170f0 0a 2a 2a 20 72 65 77 72 69 74 74 65 6e 20 77 69  .** rewritten wi
17100 74 68 6f 75 74 20 66 69 72 73 74 20 62 65 69 6e  thout first bein
17110 67 20 72 65 61 64 20 73 6f 20 74 68 65 72 65 20  g read so there 
17120 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 74 20 64  is no point it d
17130 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 64 69 73 6b  oing.** the disk
17140 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
17150 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
17160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17170 50 67 6e 6f 20 70 67 6e 6f 2c 20 44 62 50 61 67  Pgno pgno, DbPag
17180 65 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e 74 20  e **ppPage, int 
17190 63 6c 72 46 6c 61 67 29 7b 0a 20 20 50 67 48 64  clrFlag){.  PgHd
171a0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
171b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
171c0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
171d0 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
171e0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
171f0 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
17200 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
17210 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
17220 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
17230 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
17240 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
17250 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
17260 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
17270 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
17280 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
17290 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
172a0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
172b0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
172c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
172d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
172e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
172f0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
17300 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
17310 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
17320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17330 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
17340 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
17350 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
17360 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
17370 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
17380 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
17390 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
173a0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
173b0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
173c0 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
173d0 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
173e0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
173f0 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
17400 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
17410 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
17420 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
17430 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
17440 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
17450 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
17460 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
17470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17490 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
174a0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
174b0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50  _UNLOCK );..  pP
174c0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
174d0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
174e0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
174f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
17500 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
17510 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
17520 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
17530 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  ;.    TEST_INCR(
17540 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
17550 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17560 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
17570 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
17580 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d  pFirst==0 || MEM
17590 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 70  DB ||.        (p
175a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
175b0 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
175c0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 20  ->doNotSync).   
175d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
175e0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
175f0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
17600 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
17610 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
17620 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
17630 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
17640 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  er,.           p
17650 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36  Pager->nHash<256
17660 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d   ? 256 : pPager-
17670 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20  >nHash*2);.     
17680 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
17690 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Hash==0 ){.     
176a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
176b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
176c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
176d0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
176e0 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
176f0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
17700 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
17730 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
17740 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
17770 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
17780 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
17790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
177a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
177b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
177c0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
177d0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
177e0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
177f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
17800 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
17810 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
17820 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
17830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17840 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
17850 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
17860 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
17870 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
17880 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
17890 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
178a0 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
178b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
178c0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
178d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
178e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
178f0 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
17900 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
17910 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
17920 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  MaxPage++;.     
17930 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
17940 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
17950 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
17960 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69  , &pPg);.      i
17970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17980 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
179a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
179b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
179c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
179d0 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
179e0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
179f0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
17a00 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17a10 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
17a20 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
17a30 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
17a40 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
17a50 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
17a60 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
17a70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17a90 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
17aa0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
17ab0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
17ac0 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
17ad0 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
17ae0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
17af0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17b00 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
17b10 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
17b20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
17b30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
17b40 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17b50 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
17b60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
17b80 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
17b90 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
17ba0 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
17bb0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
17bc0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
17bd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17be0 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
17bf0 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
17c00 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  g);.    }.    ma
17c10 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
17c20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
17c30 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
17c40 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
17c50 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
17c60 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
17c70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
17c80 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
17c90 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
17ca0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
17cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17cc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17cd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17ce0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
17cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
17d00 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
17d10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17d20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75    }..    /* Popu
17d30 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69  late the page wi
17d40 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20  th data, either 
17d50 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  by reading from 
17d60 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
17d70 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20   ** file, or by 
17d80 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69  setting the enti
17d90 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e  re page to zero.
17da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17db0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17dc0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28 69  count(pPager)<(i
17dd0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
17de0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 63 6c  .         || (cl
17df0 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65 72  rFlag && !pPager
17e00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
17e10 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
17e20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
17e30 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
17e40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17e50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17e60 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
17e70 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
17e80 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
17e90 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
17ea0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
17eb0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17ef0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
17f00 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17f50 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
17f60 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17f70 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 54  , pgno)).      T
17f80 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
17f90 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
17fa0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17fb0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
17fc0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47  ODEC1(pPager, PG
17fd0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17fe0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
17ff0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
18010 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18020 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
18030 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30     pPg->pgno = 0
18040 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18050 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
18060 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18070 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   rc;.      }else
18080 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
18090 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
180a0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
180b0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
180c0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
180d0 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
180e0 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
180f0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
18100 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
18110 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
18120 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
18130 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
18140 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
18150 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
18160 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
18170 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
18180 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
18190 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
181a0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
181b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
181c0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
181d0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
181e0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
181f0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
18200 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
18210 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
18220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18230 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
18240 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
18250 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
18260 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
18270 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
18280 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  );.    TEST_INCR
18290 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
182a0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
182b0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
182c0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
182d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
182e0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
182f0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
18300 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
18310 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
18320 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
18330 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
18340 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
18350 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
18360 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
18370 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
18380 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
18390 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
183a0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
183b0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
183c0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
183d0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
183e0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
183f0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
18400 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
18410 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
18420 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
18430 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
18440 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
18450 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
18460 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
18470 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
18480 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
18490 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
184a0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
184b0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
184c0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
184d0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
184e0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
184f0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
18500 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
18510 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
18520 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
18530 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
18540 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18550 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
18560 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
18570 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20  usiveMode );.   
18580 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
18590 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
185a0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
185b0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
185c0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
185d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
185e0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
185f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
18600 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
18610 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
18620 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
18630 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
18640 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
18650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
18660 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
18670 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
18680 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
18690 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
186a0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
186b0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
186c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
186d0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
186e0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
186f0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
18700 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
18710 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
18720 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
18730 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
18740 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20  DbPage *pPg){.. 
18750 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
18760 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
18770 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
18780 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
18790 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
187a0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
187b0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
187c0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
187d0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
187e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
187f0 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
18800 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
18810 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
18820 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
18830 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
18840 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
18850 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
18860 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18870 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
18880 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
18890 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
188a0 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
188b0 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
188c0 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
188d0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
188e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
188f0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
18900 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
18910 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
18920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18930 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
18940 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
18950 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
18960 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
18970 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
18980 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
18990 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
189a0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
189b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
189c0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
189d0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
189e0 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
189f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18a00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
18a10 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
18a20 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
18a30 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
18a40 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
18a50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18a60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
18a70 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
18a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18a90 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
18aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
18ab0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  f==0 ){.      pa
18ac0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
18ad0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18ae0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18b00 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
18b10 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
18b20 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
18b30 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
18b40 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
18b50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
18b60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18b70 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
18b80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18b90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
18ba0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
18bb0 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
18bc0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
18bd0 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
18be0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
18bf0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
18c00 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
18c10 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
18c20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
18c30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
18c40 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
18c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18c60 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
18c70 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
18c80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18c90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
18ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18cb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
18cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18cd0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
18ce0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
18cf0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
18d00 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
18d10 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
18d20 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
18d30 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
18d40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
18d50 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
18d60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18d70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18d80 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
18d90 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
18da0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
18db0 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
18dc0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
18dd0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
18e00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
18e10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18e20 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
18e30 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
18e40 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
18e50 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
18e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69   ){.    goto fai
18e80 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
18e90 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nal;.  }.  sqlit
18ea0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
18eb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
18ec0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
18ed0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  ;.  sqlite3OsSet
18ee0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
18ef0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
18f00 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
18f10 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
18f20 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ry(pPager->jfd, 
18f30 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
18f40 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ry);.  pPager->j
18f50 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
18f60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18f70 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
18f80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18f90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
18fa0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
18fb0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
18fc0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
18fd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
18fe0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
18ff0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
19000 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
19010 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
19020 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
19030 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
19040 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
19050 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
19060 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
19070 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
19080 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
19090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
190a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
190b0 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
190c0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
190d0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
190e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
190f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
19100 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
19110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
19140 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
19150 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
19160 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
19170 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  al:.  sqliteFree
19180 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
19190 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
191a0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
191b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
191c0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
191d0 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 6d   If this was a m
191e0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
191f0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f   then we will no
19200 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74 68 65  t be closing the
19210 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 69   pager.    ** fi
19220 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20 61 6e  le. So delete an
19230 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  y journal file w
19240 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73 74 20  e may have just 
19250 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72 77 69  created. Otherwi
19260 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  se,.    ** the s
19270 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74 20 63  ystem will get c
19280 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61 76 65  onfused, we have
19290 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
192a0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61 0a 20  the file and a. 
192b0 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73     ** mysterious
192c0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 70 70   journal has app
192d0 65 61 72 65 64 20 69 6e 20 74 68 65 20 66 69 6c  eared in the fil
192e0 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a  esystem..    */.
192f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
19300 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
19310 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rnal);.  }else{.
19320 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
19330 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
19340 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19350 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
19360 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
19370 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
19380 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
19390 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
193a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
193b0 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
193c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
193d0 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
193e0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
193f0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
19400 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
19410 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19420 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
19430 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
19440 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
19450 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
19460 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
19470 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
19480 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
19490 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
194a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
194b0 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
194c0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
194d0 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
194e0 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
194f0 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
19500 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
19510 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
19520 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
19530 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
19540 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
19550 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
19560 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
19570 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
19580 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
19590 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
195a0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
195b0 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
195c0 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
195d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
195e0 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
195f0 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
19600 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
19610 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
19620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19630 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
19640 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
19650 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
19660 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
19670 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
19680 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19690 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
196a0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
196b0 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
196c0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
196d0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
196e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
196f0 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
19700 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
19710 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19720 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
19730 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
19740 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
19750 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
19760 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
19770 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
19780 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
19790 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
197a0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
197b0 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
197c0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
197d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
197e0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
197f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19800 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
19810 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
19820 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19830 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
19840 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
19850 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
19860 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
19870 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19880 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
19890 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
198a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
198b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
198c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
198d0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
198e0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
198f0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
19900 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
19910 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
19920 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
19930 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
19940 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
19950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19960 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
19970 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
19980 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
19990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
199a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
199b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
199c0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
199d0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
199e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
199f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
19a00 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
19a10 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
19a20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19a50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19a60 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
19a70 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
19a80 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
19a90 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
19aa0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19ab0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
19ac0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
19ad0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
19ae0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
19af0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
19b00 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
19b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19b20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
19b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19b40 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
19b50 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
19b60 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
19b70 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
19b80 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
19b90 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74  access mode last
19ba0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
19bb0 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
19bc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
19bd0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
19be0 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
19bf0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
19c00 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
19c10 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
19c20 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
19c30 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
19c40 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  nd truncated to 
19c50 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 bytes..    */.
19c60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19c70 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
19c80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19c90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
19ca0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
19cb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
19cc0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
19cd0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
19ce0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
19cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19d00 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
19d10 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
19d20 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
19d30 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19d40 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  aInJournal ){.  
19d50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19d60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
19d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  {.      rc = wri
19d80 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
19d90 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
19da0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
19db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
19dc0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
19dd0 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
19de0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
19df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19e00 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
19e10 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
19e20 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
19e30 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
19e40 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
19e50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
19e60 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
19e70 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
19e80 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
19e90 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19ea0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
19eb0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
19ec0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
19ed0 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
19ee0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19ef0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
19f00 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
19f10 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
19f20 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
19f30 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
19f40 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
19f50 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
19f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
19f70 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
19f80 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
19f90 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
19fa0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
19fb0 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
19fc0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
19fd0 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
19fe0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
19ff0 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
1a000 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1a010 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
1a020 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
1a030 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1a040 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
1a050 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
1a060 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1a070 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1a080 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
1a090 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1a0a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a0b0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
1a0c0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1a0d0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
1a0e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
1a0f0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1a100 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1a110 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1a120 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1a130 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1a140 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1a150 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1a160 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1a170 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1a180 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1a190 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1a1a0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1a1b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1a1c0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1a1d0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1a1e0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1a1f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1a200 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1a210 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1a220 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1a230 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1a240 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1a250 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1a260 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1a270 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1a280 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1a290 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1a2a0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1a2b0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1a2c0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1a2d0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1a2e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1a2f0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a300 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1a310 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1a320 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1a330 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1a340 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1a350 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1a360 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1a370 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1a380 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1a390 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1a3a0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1a3b0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1a3c0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1a3d0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1a3e0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1a3f0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1a400 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1a410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a420 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1a430 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1a440 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
1a450 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
1a460 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1a470 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1a480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a490 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
1a4a0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
1a4b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a4c0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
1a4d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1a4e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1a4f0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
1a500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a510 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
1a520 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1a530 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
1a540 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1a550 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1a560 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1a570 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1a580 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1a590 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1a5a0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1a5b0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1a5c0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1a5d0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1a5e0 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
1a5f0 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
1a600 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
1a610 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
1a620 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1a630 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
1a640 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
1a650 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
1a660 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1a670 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
1a680 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
1a690 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
1a6a0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
1a6b0 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
1a6c0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
1a6d0 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
1a6e0 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
1a6f0 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
1a700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1a710 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
1a720 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
1a730 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1a740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1a750 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1a760 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1a770 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1a780 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
1a790 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
1a7a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a7c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a7d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1a7e0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1a7f0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1a800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a810 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
1a820 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1a830 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1a840 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1a850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a860 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1a870 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a880 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a890 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
1a8a0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1a8b0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1a8c0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1a8d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
1a8e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1a8f0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
1a900 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
1a910 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
1a920 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1a930 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
1a940 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
1a950 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1a960 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
1a970 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1a980 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
1a990 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1a9a0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1a9b0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1a9c0 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73  l && (pPager->us
1a9d0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44  eJournal || MEMD
1a9e0 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  B) ){.      if( 
1a9f0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1aa00 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1aa10 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1aa20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20  int szPg;.      
1aa30 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1aa40 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
1aa50 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1aa60 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1aa70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1aa80 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
1aa90 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1aaa0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1aab0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1aac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1aad0 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
1aae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1aaf0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
1ab00 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1ab10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1ab20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ab30 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
1ab40 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1ab50 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
1ab60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ab70 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1ab80 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1ab90 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1aba0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1abb0 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20  cksum, saved;.  
1abc0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1abd0 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  ata2, *pEnd;.   
1abe0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1abf0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1ac00 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1ac10 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1ac20 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1ac30 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1ac40 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1ac50 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1ac60 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1ac70 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1ac80 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1ac90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1aca0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
1acb0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
1acc0 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1acd0 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1ace0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1acf0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1ad00 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
1ad10 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
1ad20 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
1ad30 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44         pEnd = pD
1ad40 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70  ata2 + pPager->p
1ad50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
1ad60 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a     pData2 -= 4;.
1ad70 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
1ad80 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20  = *(u32*)pEnd;. 
1ad90 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
1ada0 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b  ts(pEnd, cksum);
1adb0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
1adc0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1add0 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
1ade0 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1adf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ae00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ae10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1ae20 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
1ae30 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
1ae40 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
1ae50 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
1ae60 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1ae70 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
1ae80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ae90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50  >journalOff, szP
1aea0 67 29 29 0a 20 20 20 20 20 20 20 20 20 20 70 50  g)).          pP
1aeb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1aec0 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
1aed0 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52      TRACE4("JOUR
1aee0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
1aef0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1af20 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1af30 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1af40 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
1af50 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  nd = saved;...  
1af60 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1af70 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1af80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1af90 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1afa0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1afb0 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1afc0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1afd0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1afe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1aff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b020 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b030 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1b040 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1b050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1b060 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1b070 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b080 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1b090 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1b0a0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1b0b0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1b0c0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1b0d0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1b0e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b0f0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1b100 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b110 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1b120 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1b130 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1b140 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
1b150 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1b160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
1b190 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1b1a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1b1b0 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
1b1c0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1b1d0 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44    TRACE4("APPEND
1b1e0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1b1f0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1b200 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1b210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1b220 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1b230 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
1b240 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
1b250 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1b260 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b270 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1b280 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1b290 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
1b2a0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1b2b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1b2c0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1b2d0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1b2e0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1b2f0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1b300 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1b310 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1b320 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1b330 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1b340 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1b350 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1b360 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1b370 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1b380 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1b390 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1b3a0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1b3b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b3c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1b3d0 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1b3e0 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1b3f0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1b400 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
1b410 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1b420 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1b430 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1b440 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1b450 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1b460 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1b470 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1b480 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1b490 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b4a0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1b4b0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1b4c0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1b4d0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1b4e0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1b4f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1b500 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1b510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1b520 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1b530 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1b540 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1b550 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1b560 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
1b570 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1b580 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1b590 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1b5a0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1b5b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b5c0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1b5d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1b5e0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1b5f0 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20  , 7)-4;.        
1b600 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1b610 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1b620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b630 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1b640 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1b650 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b660 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  +4);.        TRA
1b670 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1b680 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1b690 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b6a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1b6b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b6d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b6f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1b700 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1b710 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1b720 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1b730 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1b740 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1b750 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1b760 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1b770 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1b780 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1b790 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b7a0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1b7b0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1b7c0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1b7d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b7e0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1b7f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1b800 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1b810 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1b820 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1b830 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1b840 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1b850 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1b860 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1b870 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1b880 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b890 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1b8a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b8b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b8c0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1b8d0 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1b8e0 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1b8f0 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1b900 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1b910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1b920 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1b930 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1b940 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1b950 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1b960 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1b970 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1b980 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b990 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1b9a0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1b9b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1b9c0 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1b9d0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1b9e0 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1b9f0 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1ba00 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1ba10 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1ba20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1ba30 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1ba40 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1ba50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1ba60 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1ba70 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1ba80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1ba90 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1baa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bab0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1bac0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1bad0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1bae0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1baf0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1bb00 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1bb10 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1bb20 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1bb30 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
1bb40 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
1bb50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
1bb60 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
1bb70 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1bb80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1bb90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1bba0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1bbc0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1bbd0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1bbe0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
1bbf0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bc10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1bc20 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
1bc30 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
1bc40 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a   int ii;..    /*
1bc50 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
1bc60 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
1bc70 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
1bc80 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
1bc90 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
1bca0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
1bcb0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
1bcc0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
1bcd0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1bce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1bcf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1bd00 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1bd10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1bd20 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
1bd30 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
1bd40 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
1bd50 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
1bd60 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
1bd70 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
1bd80 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
1bd90 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
1bda0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
1bdb0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
1bdc0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1bdd0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1bde0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
1bdf0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
1be00 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
1be10 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
1be20 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
1be30 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
1be40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1be50 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1be60 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
1be70 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1be80 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
1be90 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
1bea0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
1beb0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
1bec0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
1bed0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1bee0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
1bef0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bf00 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
1bf10 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
1bf20 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
1bf30 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
1bf40 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
1bf50 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
1bf60 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
1bf70 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
1bf80 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
1bf90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
1bfa0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
1bfb0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
1bfc0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1bfd0 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67  aInJournal || pg
1bfe0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a  ==pPg->pgno || .
1bff0 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61            pg>pPa
1c000 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1c010 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  || !(pPager->aIn
1c020 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31  Journal[pg/8]&(1
1c030 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20  <<(pg&7))).     
1c040 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   ) {.        if(
1c050 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
1c060 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1c070 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1c080 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1c090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c0a0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
1c0b0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1c0c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c0d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c0e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c0f0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1c100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c110 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
1c120 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1c130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c140 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
1c150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1c160 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
1c170 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1c180 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
1c190 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c1a0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
1c1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c1d0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
1c1e0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
1c1f0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
1c200 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
1c210 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1c220 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
1c230 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
1c240 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
1c250 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
1c260 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1c270 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
1c280 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1c290 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1c2a0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
1c2b0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
1c2c0 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69  ->dirty;.}.#endi
1c2d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1c2e0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
1c2f0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
1c300 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
1c310 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
1c320 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1c330 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
1c340 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
1c350 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
1c360 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1c370 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
1c380 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
1c390 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1c3a0 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
1c3b0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1c3c0 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29  ger, pgno, &pPg)
1c3d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c3e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c3f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c400 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
1c410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c420 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1c430 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1c440 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c  ata(pPg), pData,
1c450 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c460 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1c470 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c480 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
1c490 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1c4a0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1c4b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1c4c0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1c4d0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1c4e0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1c4f0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1c500 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
1c510 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
1c520 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1c530 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1c540 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1c550 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1c560 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1c570 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1c580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1c590 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1c5a0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1c5b0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1c5c0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1c5d0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1c5e0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1c5f0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1c600 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1c610 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1c620 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1c630 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1c640 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1c650 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1c660 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1c670 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1c680 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1c690 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1c6a0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1c6b0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1c6c0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1c6d0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1c6e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1c6f0 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1c700 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1c710 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1c720 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1c730 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1c740 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1c750 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1c760 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1c770 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1c780 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1c790 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1c7a0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1c7b0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1c7c0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1c7d0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1c7e0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1c7f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1c800 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1c810 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1c820 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1c830 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1c840 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1c850 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1c860 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1c870 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1c880 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1c890 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1c8a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1c8b0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1c8c0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
1c8d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1c8e0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1c8f0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
1c900 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
1c910 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1c920 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1c930 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
1c940 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
1c950 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
1c960 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
1c970 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1c980 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 61  agerDontWrite(Pa
1c990 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1c9a0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1c9b0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45   *pPg;..  if( ME
1c9c0 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  MDB ) return;.. 
1c9d0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1c9e0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1c9f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1ca00 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65  !=0 );  /* We ne
1ca10 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77  ver call _dont_w
1ca20 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20  rite unless the 
1ca30 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a  page is in mem *
1ca40 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  /.  pPg->alwaysR
1ca50 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
1ca60 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
1ca70 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1ca80 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
1ca90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1caa0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1cab0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1cac0 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1cad0 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1cae0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1caf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1cb00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1cb10 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1cb20 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1cb30 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1cb40 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1cb50 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1cb60 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1cb70 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1cb80 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1cb90 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1cba0 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1cbb0 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1cbc0 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1cbd0 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1cbe0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1cbf0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1cc00 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1cc10 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1cc20 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1cc30 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1cc40 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1cc50 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1cc60 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1cc70 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1cc80 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1cc90 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1cca0 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1ccb0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1ccc0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1ccd0 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1cce0 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1ccf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1cd00 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
1cd10 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
1cd20 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1cd30 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70   pgno, PAGERID(p
1cd40 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
1cd50 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
1cd60 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1cd70 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61   pgno)).      ma
1cd80 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
1cd90 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1cda0 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
1cdb0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1cdc0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1cdd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
1cde0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
1cdf0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1ce00 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1ce10 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1ce20 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1ce30 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1ce40 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1ce50 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1ce60 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1ce70 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1ce80 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1ce90 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1cea0 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1ceb0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1cec0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
1ced0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1cee0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
1cef0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
1cf00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1cf10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
1cf20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cf30 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1cf40 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
1cf50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1cf60 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
1cf70 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
1cf80 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
1cf90 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1cfa0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
1cfb0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
1cfc0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1cfd0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1cfe0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1cff0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1d000 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1d010 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1d020 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1d030 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1d040 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1d050 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
1d060 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1d070 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1d080 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1d090 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1d0a0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1d0b0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1d0c0 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
1d0d0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1d0e0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
1d0f0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1d100 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1d110 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1d120 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d130 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
1d140 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
1d150 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1d160 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
1d170 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d180 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1d190 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1d1a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1d1b0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
1d1c0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1d1d0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1d1e0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1d1f0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1d200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d210 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1d220 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1d230 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1d240 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1d250 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
1d260 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1d270 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
1d280 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1d290 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1d2a0 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1d2b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1d2c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d2d0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1d2e0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1d2f0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1d300 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1d310 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1d320 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1d330 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1d340 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1d350 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1d360 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1d370 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1d380 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1d390 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1d3a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1d3b0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1d3c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d3d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1d3e0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
1d3f0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1d400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d410 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
1d420 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1d430 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d440 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1d450 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1d460 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1d470 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1d480 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1d490 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1d4a0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1d4b0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1d4c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1d4d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1d4e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1d4f0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1d500 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1d510 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1d520 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1d530 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1d540 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1d550 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1d560 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
1d570 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1d580 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
1d590 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1d5a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1d5b0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1d5c0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1d5d0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1d5e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1d5f0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1d600 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1d610 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1d620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1d630 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1d640 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1d650 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1d660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1d670 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1d680 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1d690 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1d6a0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1d6b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d6c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
1d6d0 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
1d6e0 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
1d6f0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
1d700 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
1d710 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
1d720 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
1d730 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
1d740 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
1d750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d760 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1d770 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1d780 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
1d790 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1d7a0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1d7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d7c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d7d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1d7e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1d7f0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1d800 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
1d810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d820 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1d830 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1d840 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1d860 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
1d870 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
1d880 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
1d890 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
1d8a0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
1d8b0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
1d8c0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
1d8d0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
1d8e0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
1d8f0 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
1d900 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1d910 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1d920 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1d930 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
1d940 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
1d950 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
1d960 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
1d970 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
1d980 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1d990 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
1d9a0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
1d9b0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1d9c0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
1d9d0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
1d9e0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
1d9f0 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
1da00 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
1da10 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
1da20 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
1da30 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
1da40 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
1da50 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
1da60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1da70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1da80 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
1da90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1daa0 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
1dab0 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
1dac0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1dad0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1dae0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1daf0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
1db00 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
1db10 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1db20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1db30 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
1db40 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
1db50 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
1db60 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
1db70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1db80 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
1db90 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1dba0 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
1dbb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1dbc0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
1dbd0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
1dbe0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
1dbf0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
1dc00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
1dc10 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
1dc20 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1dc30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1dc40 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
1dc50 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1dc60 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1dc70 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
1dc80 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1dc90 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
1dca0 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
1dcb0 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
1dcc0 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
1dcd0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1dce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dcf0 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
1dd00 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
1dd10 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1dd20 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1dd30 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
1dd40 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
1dd50 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
1dd60 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1dd70 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1dd80 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
1dd90 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
1dda0 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
1ddb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1ddc0 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1ddd0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1dde0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1ddf0 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
1de00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1de10 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1de20 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1de30 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1de40 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1de50 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1de60 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1de70 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1de80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1de90 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1dea0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1deb0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1dec0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1ded0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dee0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1def0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1df00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1df10 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1df20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1df30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  k(pPager);.    r
1df40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1df50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1df60 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1df70 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1df80 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
1df90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1dfa0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
1dfb0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
1dfc0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
1dfd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
1dfe0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1dff0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1e000 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1e010 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1e020 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1e030 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1e040 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
1e050 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
1e060 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1e070 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1e080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e090 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1e0a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e0b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1e0c0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
1e0d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1e0e0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
1e0f0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
1e100 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
1e110 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
1e120 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
1e130 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
1e140 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
1e150 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
1e160 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
1e170 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
1e180 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
1e190 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67   */.  return pag
1e1a0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1e1b0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
1e1c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1e1d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e1e0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
1e1f0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
1e200 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
1e210 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
1e220 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
1e230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e240 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
1e250 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1e260 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
1e270 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
1e280 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1e290 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1e2a0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
1e2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e2c0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
1e2d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1e2e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
1e2f0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1e300 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
1e310 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1e320 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
1e330 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
1e340 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
1e350 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
1e360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
1e370 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
1e380 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
1e390 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
1e3a0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
1e3b0 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
1e3c0 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
1e3d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1e3e0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
1e3f0 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
1e400 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1e410 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
1e420 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
1e430 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
1e440 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
1e450 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d  r->nOvfl;.  a[9]
1e460 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
1e470 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
1e480 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
1e490 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
1e4a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1e4b0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
1e4c0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
1e4d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
1e4e0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
1e4f0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
1e500 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
1e510 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
1e520 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
1e530 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
1e540 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1e550 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
1e560 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
1e570 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
1e580 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
1e590 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1e5a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e5b0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
1e5c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e5d0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
1e5e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e5f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e600 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e610 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
1e620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1e630 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52  bSize>=0 );.  TR
1e640 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
1e650 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1e660 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1e670 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
1e680 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1e690 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1e6a0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1e6b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
1e6c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e6d0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
1e6e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1e6f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1e700 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
1e710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1e730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1e740 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
1e750 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1e760 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1e770 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1e780 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
1e790 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
1e7a0 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
1e7b0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1e7c0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
1e7d0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1e7e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1e7f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1e800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e810 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1e820 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
1e830 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
1e840 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1e850 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1e860 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e870 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
1e880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1e890 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
1e8a0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
1e8b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e8c0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
1e8d0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1e8e0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
1e8f0 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
1e900 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
1e910 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
1e920 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
1e930 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
1e940 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1e950 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1e960 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74  temp(&pPager->st
1e970 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
1e980 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1e990 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
1e9a0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1e9b0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1e9c0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1e9d0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1e9e0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
1e9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ea00 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
1ea10 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
1ea20 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
1ea30 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1ea40 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
1ea50 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1ea60 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1ea70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ea80 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
1ea90 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1eaa0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
1eab0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1eac0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1ead0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1eae0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1eaf0 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
1eb00 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
1eb10 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1eb20 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
1eb30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
1eb40 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
1eb50 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
1eb60 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
1eb70 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1eb80 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
1eb90 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1eba0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1ebb0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
1ebc0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
1ebd0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
1ebe0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
1ebf0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
1ec00 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
1ec10 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
1ec20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1ec30 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
1ec40 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1ec50 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1ec60 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1ec70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1ec80 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1ec90 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1eca0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1ecb0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1ecc0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ecd0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1ece0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1ecf0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1ed00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ed10 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
1ed20 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
1ed30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1ed40 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
1ed50 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
1ed60 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1ed70 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
1ed80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ed90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1eda0 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
1edb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1edc0 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
1edd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ede0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1edf0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1ee00 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
1ee10 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
1ee20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1ee30 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1ee40 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1ee50 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1ee60 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1ee70 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1ee80 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
1ee90 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1eea0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1eeb0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1eec0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1eed0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1eee0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1eef0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
1ef00 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
1ef10 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
1ef20 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ef30 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1ef40 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1ef50 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1ef60 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1ef70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ef80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1ef90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
1efa0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
1efb0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1efc0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1efd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1efe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1eff0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
1f000 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1f010 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
1f020 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
1f030 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1f040 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1f050 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
1f060 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1f070 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1f080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f090 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1f0a0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1f0b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1f0c0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f0d0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
1f0e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f0f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1f100 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1f110 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
1f120 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
1f130 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1f140 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1f150 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
1f160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f170 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1f180 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
1f190 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f1a0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1f1b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1f1c0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1f1d0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
1f1e0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
1f1f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1f200 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1f210 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1f220 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1f230 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1f240 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1f250 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1f260 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1f270 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1f280 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1f290 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1f2a0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
1f2b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1f2c0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
1f2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f2e0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
1f2f0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
1f300 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
1f310 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
1f320 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
1f330 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
1f340 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
1f350 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
1f360 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
1f370 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
1f380 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
1f390 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
1f3a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1f3b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1f3c0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
1f3d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
1f3e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
1f3f0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
1f400 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
1f410 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1f420 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
1f430 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
1f440 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f450 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
1f460 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1f470 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
1f480 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
1f490 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
1f4a0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  {.    /* Open pa
1f4b0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1f4c0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1f4d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f4e0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1f4f0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
1f500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f510 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1f520 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f530 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1f540 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1f550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f560 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20  turn rc;.  .    
1f570 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
1f580 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
1f590 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1f5a0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1f5b0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1f5c0 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20  Hdr, 24);.  .   
1f5d0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1f5e0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1f5f0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1f600 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1f610 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
1f620 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
1f630 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
1f640 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1f650 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
1f660 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 70  _counter);.    p
1f670 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
1f680 75 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63 6f 75  unt = change_cou
1f690 6e 74 65 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  nter;.  .    /* 
1f6a0 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
1f6b0 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
1f6c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f6d0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
1f6e0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1f6f0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
1f700 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f720 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1f730 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
1f740 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
1f750 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
1f760 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
1f770 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f780 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1f790 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1f7a0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
1f7b0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1f7c0 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
1f7d0 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
1f7e0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
1f7f0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1f800 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
1f810 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1f820 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
1f830 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
1f840 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1f850 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
1f860 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
1f870 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
1f880 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
1f890 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f8a0 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
1f8b0 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
1f8c0 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
1f8d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f8e0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1f8f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1f900 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
1f910 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
1f920 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
1f930 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
1f940 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
1f950 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
1f960 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
1f970 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
1f980 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
1f990 53 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  Sync() call..**.
1f9a0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1f9b0 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
1f9c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
1f9d0 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
1f9e0 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
1f9f0 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
1fa00 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1fa10 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
1fa20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1fa30 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
1fa40 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
1fa50 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
1fa60 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
1fa70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fa80 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41  ..  TRACE4("DATA
1fa90 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1faa0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1fab0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1fac0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1fad0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1fae0 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1faf0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1fb00 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1fb10 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1fb20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1fb30 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1fb40 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1fb50 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1fb60 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1fb70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1fb80 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1fb90 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1fba0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1fbb0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1fbc0 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
1fbd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fbe0 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
1fbf0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1fc00 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
1fc10 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1fc20 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
1fc30 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1fc40 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
1fc50 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
1fc60 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
1fc70 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
1fc80 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
1fc90 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
1fca0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1fcb0 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
1fcc0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1fcd0 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
1fce0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
1fcf0 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
1fd00 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1fd10 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
1fd20 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
1fd30 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
1fd40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fd50 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1fd60 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
1fd70 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1fd80 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
1fd90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fdb0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
1fdc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fdd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1fde0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1fdf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1fe00 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1fe10 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1fe20 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1fe30 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1fe40 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
1fe50 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
1fe60 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
1fe70 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
1fe80 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1fe90 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1fea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1feb0 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
1fec0 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45  int iSkip = PAGE
1fed0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1fee0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  );.        for( 
1fef0 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1ff00 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1ff10 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1ff20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72      if( !(pPager
1ff30 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38  ->aInJournal[i/8
1ff40 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20  ] & (1<<(i&7))) 
1ff50 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
1ff60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1ff70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1ff80 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
1ff90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1ffa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ffb0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1ffc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1ffd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ffe0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
1fff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
20000 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
20010 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
20020 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
20030 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
20040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20050 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
20060 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
20070 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
20080 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
20090 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
200a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
200b0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
200c0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
200d0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
200e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
200f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
20100 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
20110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20120 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20130 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
20140 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20150 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20160 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
20170 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
20180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
20190 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
201a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
201b0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
201c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
201d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
201e0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
201f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
20200 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
20210 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
20220 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
20230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20240 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20250 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
20260 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
20270 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
20280 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
20290 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
202a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
202b0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  c(pPager->fd, 0)
202c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
202d0 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
202e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
202f0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20300 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
20310 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44    }else if( MEMD
20320 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29  B && nTrunc!=0 )
20330 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20340 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
20350 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
20360 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
20370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20390 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
203a0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
203b0 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
203c0 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74  y pData to locat
203d0 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
203e0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  file. .**.** The
203f0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
20400 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20410 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e  current page pgn
20420 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61  o. If current pa
20430 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f  ge.** pgno is no
20440 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
20450 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20460 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69  l, it is not wri
20470 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a  tten there by.**
20480 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
20490 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69  . The same appli
204a0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
204b0 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f  Data refers to o
204c0 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  n entry to.** th
204d0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
204e0 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
204f0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64  the page refered
20500 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d   to by pData rem
20510 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
20520 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
20530 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
20540 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20  with page pData 
20550 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
20560 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
20570 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
20580 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
20590 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
205a0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
205b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
205c0 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
205d0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
205e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
205f0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
20600 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
20610 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
20620 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
20630 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
20640 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
20650 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
20660 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
20670 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
20680 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
20690 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
206a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
206b0 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69  is active)..*/.i
206c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
206d0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
206e0 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
206f0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
20700 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
20710 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
20720 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
20730 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
20740 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
20750 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64   TRACE5("MOVE %d
20760 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
20770 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
20780 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
20790 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
207a0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
207b0 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
207c0 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
207d0 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
207e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
207f0 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70   pgno))..  if( p
20800 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
20810 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
20820 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
20830 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
20840 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
20850 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
20860 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
20870 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
20880 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
20890 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
208a0 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
208b0 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
208c0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
208d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
208e0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
208f0 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
20900 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
20910 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
20920 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
20930 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
20940 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
20950 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
20960 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
20970 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
20980 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
20990 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
209a0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
209b0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
209c0 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
209d0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
209e0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
209f0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
20a00 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
20a10 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
20a20 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
20a30 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
20a40 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
20a50 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50  Old);.    if( pP
20a60 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
20a70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20a80 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
20a90 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
20aa0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
20ab0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
20ac0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
20ad0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
20ae0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
20af0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
20b00 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
20b10 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
20b20 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
20b30 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
20b40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
20b50 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
20b60 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
20b70 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
20b80 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
20b90 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
20ba0 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
20bb0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
20bc0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
20bd0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
20be0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
20bf0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
20c00 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
20c10 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
20c20 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
20c30 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
20c40 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
20c50 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
20c60 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
20c70 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
20c80 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
20c90 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
20ca0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
20cb0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
20cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20cd0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
20ce0 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
20cf0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
20d00 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
20d10 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
20d20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
20d30 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
20d40 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
20d50 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
20d60 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
20d70 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
20d80 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
20d90 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
20da0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
20db0 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
20dc0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
20dd0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
20de0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
20df0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
20e00 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
20e10 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
20e20 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
20e30 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
20e40 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
20e50 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
20e60 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
20e70 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
20e80 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
20e90 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50     int rc;.    P
20ea0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
20eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20ec0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
20ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20ee0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
20ef0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
20f00 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
20f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
20f20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
20f30 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
20f40 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
20f50 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
20f60 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
20f70 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
20f80 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
20f90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20fa0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
20fb0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
20fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
20fd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
20fe0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
20ff0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
21000 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
21010 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
21020 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
21030 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
21040 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
21050 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
21060 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
21070 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
21080 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
21090 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
210a0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
210b0 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
210c0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
210d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
210e0 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
210f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21100 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21110 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
21120 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
21130 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
21140 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
21150 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
21160 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
21170 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
21180 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
21190 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
211a0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
211b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
211c0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
211d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
211e0 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
211f0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
21200 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
21210 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
21220 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
21230 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
21240 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
21250 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
21260 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
21270 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
21280 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
21290 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
212a0 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
212b0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
212c0 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
212d0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
212e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
212f0 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
21300 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21310 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 65   eMode){.  if( e
21320 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Mode>=0 ){.    p
21330 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
21340 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
21350 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
21360 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
21370 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eMode;.}..#if de
21380 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
21390 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
213a0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
213b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
213c0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
213d0 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
213e0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
213f0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
21400 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
21410 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
21420 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
21430 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
21440 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
21450 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
21460 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73  qlite3PagerLocks
21470 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
21480 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
21490 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
214a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
214b0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
214c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
214d0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
214e0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
214f0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
21500 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
21510 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21520 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
21530 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
21540 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
21550 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
21560 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
21570 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
21580 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
21590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
215a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
215b0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
215c0 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
215d0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
215e0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
215f0 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
21600 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
21610 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21620 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
21630 0a                                               .