/ Hex Artifact Content
Login

Artifact 4c83ffbb02386d0fd90eef51c16097c74e5b785a:


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: 36 20 32 30 30 37 2f 30 33 2f 32 36 20 31 30 3a  6 2007/03/26 10:
0360: 32 37 3a 31 39 20 64 61 6e 69 65 6c 6b 31 39 37  27:19 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 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50   if( p->state>=P
7d20: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
7d40: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
7d50: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
7d60: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
7d70: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
7d80: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
7d90: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
7da0: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
7db0: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
7dc0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
7dd0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
7de0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
7df0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  ;.}.../*.** Unlo
7e00: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
7e10: 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e  and clear the in
7e20: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
7e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
7e40: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
7e50: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
7e60: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
7e70: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
7e80: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
7e90: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
7ea0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
7eb0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
7ec0: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
7ed0: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
7ee0: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
7ef0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
7f00: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
7f10: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
7f20: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
7f30: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
7f40: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
7f50: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
7f60: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
7f70: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7f80: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
7f90: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
7fa0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
7fb0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
7fc0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
7fd0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
7fe0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
7ff0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8000: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
8010: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
8020: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
8030: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8040: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
8050: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
8060: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
8070: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
8080: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b  ager->aHash = 0;
8090: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
80a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  = 0;.}../*.** Wh
80b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
80c0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
80d0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
80e0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
80f0: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
8100: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
8110: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
8120: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
8130: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
8140: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
8150: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
8160: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
8170: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
8180: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
8190: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
81a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
81b0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
81c0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
81d0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
81e0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
81f0: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
8200: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
8210: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
8220: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
8230: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
8240: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
8250: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
8260: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8270: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
8280: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
8290: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
82a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
82b0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
82c0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
82d0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
82e0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
82f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8300: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
8310: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
8320: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
8330: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
8340: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
8350: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
8360: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
8370: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
8380: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8390: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
83a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
83b0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  tmtOpen = 0;.   
83c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
83d0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
83e0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
83f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8400: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8410: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
8420: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8430: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
8440: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
8450: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
8460: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8470: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
8480: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  fd, 0);.      pP
8490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
84a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
84b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
84c0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
84d0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
84e0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
84f0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
8500: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
8520: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
8530: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
8540: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
8550: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
8560: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
8570: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8580: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
8590: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
85a0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
85b0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
85c0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
85d0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
85e0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
85f0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
8600: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
8610: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
8620: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8630: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
8640: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
8650: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
8660: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
8670: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
8680: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
8690: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
86a0: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
86b0: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
86c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
86d0: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
86e0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
86f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8700: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
8710: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
8720: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
8730: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
8740: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
8750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8760: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
8770: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
8780: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8790: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
87a0: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
87b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
87c0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
87d0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
87e0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
87f0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
8800: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
8810: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
8820: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
8830: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
8840: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8850: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
8860: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61  r->pFirst;.  pPa
8870: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
8880: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8890: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
88a0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
88b0: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
88c0: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
88d0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
88e0: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
88f0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
8900: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
8910: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
8920: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
8930: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
8940: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
8950: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
8960: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
8970: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
8980: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
8990: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
89a0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
89b0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
89c0: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
89d0: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
89e0: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
89f0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8a00: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
8a10: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
8a20: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
8a30: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
8a40: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
8a50: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
8a60: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
8a70: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
8a80: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
8a90: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
8aa0: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
8ab0: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
8ac0: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
8ad0: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
8ae0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
8af0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
8b00: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
8b10: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
8b20: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
8b30: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
8b40: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
8b50: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
8b60: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
8b70: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
8b80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
8b90: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
8ba0: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
8bb0: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
8bc0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
8bd0: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
8be0: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
8bf0: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
8c00: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
8c10: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
8c20: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
8c30: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
8c40: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
8c50: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
8c60: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
8c70: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8c80: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
8c90: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
8ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
8cb0: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
8cc0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
8cd0: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
8ce0: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
8cf0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
8d00: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
8d10: 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77  ageSize-200;.  w
8d20: 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
8d30: 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
8d40: 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
8d50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
8d60: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ksum;.}../* Forw
8d70: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
8d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
8d90: 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29  akeClean(PgHdr*)
8da0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  ;../*.** Read a 
8db0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8dd0: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
8de0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
8df0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
8e00: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
8e10: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
8e20: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
8e30: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
8e40: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
8e50: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
8e60: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
8e70: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8e80: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
8e90: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
8ea0: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
8eb0: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
8ec0: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
8ed0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
8ee0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
8ef0: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
8f00: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
8f10: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
8f20: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
8f50: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
8f60: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8f80: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8f90: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
8fa0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
8fb0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
8fe0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
8ff0: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
9000: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
9010: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
9020: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
9030: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
9040: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
9050: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
9060: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9070: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
9080: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
9090: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
90a0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
90b0: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
90c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
90d0: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
90e0: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
90f0: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
9100: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
9110: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
9120: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
9130: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9140: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9150: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
9160: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
9170: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9180: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
9190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
91a0: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
91b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
91c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
91d0: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
91e0: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
91f0: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
9200: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
9210: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
9220: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
9230: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
9240: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
9250: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
9260: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
9270: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
9280: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
9290: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
92a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
92b0: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
92c0: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
92d0: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
92e0: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
92f0: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
9300: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
9310: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
9320: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
9330: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
9340: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9350: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
9360: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
9370: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
9380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9390: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
93a0: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
93b0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
93c0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
93d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
93e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
93f0: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
9400: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
9410: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
9420: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
9430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9440: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
9450: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9460: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
9470: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
9480: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9490: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
94a0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
94b0: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
94c0: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
94d0: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
94e0: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
94f0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9500: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
9510: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
9520: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
9530: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
9540: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
9550: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
9560: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
9570: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
9580: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
9590: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
95a0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
95b0: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
95c0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
95d0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
95e0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
95f0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
9600: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
9610: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
9620: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
9630: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
9640: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
9650: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
9660: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9670: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9680: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9690: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
96a0: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
96b0: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
96c0: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
96d0: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
96e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
96f0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9700: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
9710: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
9720: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
9730: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
9740: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
9750: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
9760: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9770: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9780: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
97a0: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
97b0: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
97c0: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
97d0: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
97e0: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
97f0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9800: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
9810: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
9820: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
9830: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
9840: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
9850: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
9860: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9870: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9880: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9890: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
98a0: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
98b0: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
98c0: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
98d0: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
98e0: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
98f0: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9900: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
9910: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
9920: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
9930: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
9940: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
9950: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
9960: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9970: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9980: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9990: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
99a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
99b0: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
99c0: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
99d0: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
99e0: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
99f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9a00: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9a10: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
9a20: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
9a30: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9a40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9a50: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9a60: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9a70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9a80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9a90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9aa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9ab0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9ac0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9ad0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9ae0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9af0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9b00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9b10: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
9b20: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
9b30: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
9b40: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
9b50: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
9b60: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9b70: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9b80: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9b90: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9ba0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9bb0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9bc0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9bd0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
9be0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9bf0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
9c00: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
9c10: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
9c20: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
9c30: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9c40: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9c50: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
9c60: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
9c70: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
9c80: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
9c90: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
9ca0: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
9cb0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
9cc0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
9cd0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9ce0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9cf0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
9d00: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
9d10: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
9d20: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
9d30: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
9d40: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
9d50: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
9d60: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
9d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
9d80: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
9d90: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
9da0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
9db0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
9dc0: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
9dd0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
9de0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
9df0: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
9e00: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
9e10: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43  alue of Pager.iC
9e20: 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20  hangeCount */.  
9e30: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
9e40: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  .      pPager->i
9e50: 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
9e60: 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
9e70: 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 24);.    }.  }
9e80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9e90: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
9ea0: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
9eb0: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
9ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
9ed0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
9ee0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
9ef0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
9f00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9f10: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
9f20: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
9f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
9f40: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
9f50: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
9f60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9f70: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
9f80: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
9f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
9fa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
9fb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
9fc0: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
9fd0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
9fe0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
9ff0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a000: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a010: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a020: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a030: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a040: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a050: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a060: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a070: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a080: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a090: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a0a0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a0b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a0c0: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a0d0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a0e0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a0f0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a100: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a110: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a120: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a130: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a150: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a160: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a170: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a180: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a190: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a1a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a1b0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a1c0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a1d0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a1e0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a1f0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a200: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a210: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a220: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a230: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a240: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a250: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
a260: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a270: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a280: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
a290: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
a2a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a2b0: 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  ze(master, &nMas
a2c0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
a2d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a2e0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a2f0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
a300: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
a310: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
a320: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
a330: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
a340: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
a350: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
a360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
a370: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
a380: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
a390: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
a3a0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
a3b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
a3c0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
a3d0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
a3e0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
a3f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a400: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
a410: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
a420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a430: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
a440: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a450: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
a460: 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65  ite3OsRead(maste
a470: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
a480: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
a490: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
a4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a4b0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a4c0: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
a4d0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
a4e0: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
a4f0: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
a500: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
a510: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
a520: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
a530: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
a540: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
a550: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
a560: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
a570: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a580: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
a590: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
a5a0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
a5b0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
a5c0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
a5d0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
a5e0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
a5f0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
a600: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
a610: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a620: 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c   OsFile *journal
a630: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
a640: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  t c;..        rc
a650: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a660: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
a670: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
a680: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a6a0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a6b0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a6c0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
a6d0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
a6e0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
a6f0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a700: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a710: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
a720: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a730: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a740: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a750: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a760: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
a770: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
a780: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
a790: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
a7a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
a7b0: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
a7c0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
a7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
a7e0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
a7f0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
a800: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a810: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
a820: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a830: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
a850: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
a860: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
a870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
a880: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
a890: 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73  Master);..delmas
a8a0: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
a8b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
a8c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a8d0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
a8e0: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
a8f0: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
a900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
a910: 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  master);.  }.  r
a920: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
a930: 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76   0./*.** Make ev
a940: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a950: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a960: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a970: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a980: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a990: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a9a0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a9b0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a9c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a9d0: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a9e0: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a9f0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
aa00: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
aa10: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
aa20: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
aa30: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
aa40: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
aa50: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
aa60: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
aa70: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
aa80: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
aa90: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
aaa0: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
aab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
aac0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
aad0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
aae0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
aaf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ab00: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
ab10: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
ab20: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
ab30: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
ab40: 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e  *zBuf = pPager->
ab50: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
ab60: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
ab70: 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a  e for one page *
ab80: 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
ab90: 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65  dirty ) continue
aba0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70  ;.    if( (int)p
abb0: 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
abc0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
abd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
abe0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
abf0: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
ac00: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50  ageSize*(i64)(pP
ac10: 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20  g->pgno-1));.   
ac20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ac30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ac40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ac50: 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  ad(pPager->fd, z
ac60: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
ac70: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
ac80: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45        TRACE3("RE
ac90: 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
aca0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
acb0: 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
acc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
acd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f   break;.      CO
ace0: 44 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75  DEC1(pPager, zBu
acf0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
ad00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ad10: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
ad20: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
ad30: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
ad40: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
ad50: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
ad60: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
ad70: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
ad80: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
ad90: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
ada0: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
adb0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
adc0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
add0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
ade0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
adf0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
ae00: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ae10: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
ae20: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
ae30: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
ae40: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
ae50: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
ae60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ae70: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
ae80: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
ae90: 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
aea0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
aeb0: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
aec0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
aed0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
aee0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65  ndif.  }.  pPage
aef0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
af00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
af10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
af20: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
af30: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
af40: 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d  pager to the num
af50: 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
af60: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74  indicated..*/.st
af70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
af80: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
af90: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
afa0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
afb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
afc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
afd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
afe0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
aff0: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
b000: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
b010: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  e);.}../*.** Pla
b020: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
b030: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
b040: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
b050: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
b060: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
b070: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
b080: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
b090: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
b0a0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
b0b0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
b0c0: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
b0d0: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
b0e0: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
b0f0: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
b100: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
b110: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
b120: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b130: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
b140: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
b150: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
b160: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
b170: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
b180: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
b190: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
b1a0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
b1b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
b1c0: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
b1d0: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
b1e0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b1f0: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
b200: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
b210: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
b220: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
b230: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b240: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b250: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
b260: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
b270: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
b280: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
b290: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
b2a0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
b2b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b2c0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
b2d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
b2e0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
b2f0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
b300: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
b310: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
b320: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
b330: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20  urnal.).**  (6) 
b340: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
b350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
b360: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
b370: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
b380: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
b390: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
b3a0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
b3b0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
b3c0: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
b3d0: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
b3e0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
b3f0: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
b400: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
b410: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
b420: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
b430: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
b440: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29  n UTF-8..**  (7)
b450: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
b460: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
b470: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
b480: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b490: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
b4a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
b4b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
b4c0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
b4d0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
b4e0: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
b4f0: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
b500: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
b510: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
b520: 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73  he first 6 items
b530: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
b540: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
b550: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
b560: 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69  nce of the 7th i
b570: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
b580: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
b590: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
b5a0: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
b5b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
b5c0: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
b5d0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
b5e0: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
b5f0: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
b600: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
b610: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
b620: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b630: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
b640: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
b650: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
b660: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
b670: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
b680: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
b690: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
b6a0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
b6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b6c0: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
b6d0: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
b6e0: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
b6f0: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
b700: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
b710: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
b720: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
b730: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
b740: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
b750: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
b760: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
b770: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
b780: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
b790: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
b7a0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
b7b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
b7c0: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
b7d0: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
b7e0: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
b7f0: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
b800: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b810: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
b820: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
b830: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
b840: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
b850: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
b860: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
b870: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
b880: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
b890: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
b8a0: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
b8b0: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
b8c0: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
b8d0: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
b8e0: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
b8f0: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
b900: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
b910: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
b920: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
b930: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
b940: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
b950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
b960: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
b970: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
b980: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
b990: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
b9a0: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
b9b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b9c0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
b9d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b9e0: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
b9f0: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
ba00: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
ba10: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
ba20: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
ba30: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
ba40: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
ba50: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
ba60: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
ba70: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
ba80: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
ba90: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
baa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
bab0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
bac0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
bad0: 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
bae0: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb00: 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
bb10: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
bb20: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
bb50: 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
bb60: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  nal */.  int i; 
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
bb90: 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
bba0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bbb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
bbc0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
bbd0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
bbe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bbf0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bc00: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
bc10: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  ne */.  char *zM
bc20: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
bc30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
bc40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bc50: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
bc60: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
bc70: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
bc80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
bc90: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
bca0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
bcb0: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
bcc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bcd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
bce0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
bcf0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
bd00: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
bd10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bd20: 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
bd30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
bd40: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
bd50: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
bd60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
bd70: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
bd80: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
bd90: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
bda0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
bdb0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
bdc0: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
bdd0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
bde0: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
bdf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
be00: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
be10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
be20: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
be30: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
be40: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
be50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d  pPager->jfd, &zM
be60: 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74  aster);.  assert
be70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
be80: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
be90: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
bea0: 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33  ster && !sqlite3
beb0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61  OsFileExists(zMa
bec0: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71  ster)) ){.    sq
bed0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
bee0: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
bef0: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
bf00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
bf10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bf20: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bf30: 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ack;.  }.  sqlit
bf40: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
bf50: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
bf60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
bf70: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
bf80: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
bf90: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
bfa0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
bfb0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
bfc0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
bfd0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
bfe0: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
bff0: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
c000: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
c010: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
c020: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c030: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
c040: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
c050: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
c060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c070: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
c080: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
c090: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
c0a0: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
c0b0: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
c0c0: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
c0d0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
c0e0: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
c0f0: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
c100: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
c110: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
c120: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
c130: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
c140: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
c150: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c160: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
c170: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
c180: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
c190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
c1a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
c1b0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
c1c0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
c1d0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
c1e0: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
c1f0: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
c200: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
c210: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
c220: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
c230: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
c240: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
c250: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
c260: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
c270: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
c280: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
c290: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
c2a0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
c2b0: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
c2c0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
c2d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
c2e0: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
c2f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c300: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c310: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
c320: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
c330: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
c340: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
c350: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
c360: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c380: 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
c390: 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
c3a0: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
c3b0: 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
c3c0: 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
c3d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
c3e0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
c3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73  ournal file cons
c400: 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a  ists of.    ** j
c410: 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73  ournalled copies
c420: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e   of pages that n
c430: 65 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62  eed to be read b
c440: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ack into the cac
c450: 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  he..    */.    i
c460: 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
c470: 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52  sHot ){.      nR
c480: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
c490: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
c4a0: 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
c4b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
c4c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
c4d0: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
c4e0: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
c4f0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
c500: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
c510: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
c520: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
c530: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
c540: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
c550: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
c560: 55 53 49 56 45 20 26 26 20 0a 20 20 20 20 20 20  USIVE && .      
c570: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c580: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
c590: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
c5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c5b0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c5c0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
c5d0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
c5e0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
c5f0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
c600: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
c610: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
c630: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
c640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c650: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
c660: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
c670: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
c680: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
c690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
c6a0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
c6b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
c6c0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
c6d0: 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
c6e0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
c6f0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
c700: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
c710: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
c720: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c730: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
c740: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
c750: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
c760: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c770: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
c780: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
c790: 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
c7a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
c7b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e{.          got
c7c0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c7d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
c7f0: 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
c800: 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
c810: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
c820: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c830: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c840: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
c850: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
c860: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f  zMaster ){.    /
c870: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
c880: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c890: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
c8a0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75   will return tru
c8b0: 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  e,.    ** see if
c8c0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
c8d0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
c8e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
c8f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
c900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c910: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
c920: 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72  elmaster(zMaster
c930: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
c940: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
c950: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
c960: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
c970: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
c980: 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
c990: 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
c9a0: 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
c9b0: 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
c9c0: 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
c9d0: 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45  fferent PAGER_SE
c9e0: 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76  CTOR_SIZE.  ** v
c9f0: 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
ca00: 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
ca10: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
ca20: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  cess..  */.  pPa
ca30: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
ca40: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
ca50: 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
ca60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ca70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
ca80: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
ca90: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
caa0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
cab0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
cac0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
cad0: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
cae0: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
caf0: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
cb00: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
cb10: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
cb20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
cb30: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
cb40: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
cb50: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
cb60: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
cb70: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
cb80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
cb90: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
cba0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
cbb0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
cbc0: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
cbd0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
cbe0: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
cbf0: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
cc00: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
cc10: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
cc20: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
cc30: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
cc40: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
cc50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc60: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
cc70: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
cc80: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cca0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
ccb0: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
ccc0: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
ccd0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
cce0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ccf0: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
cd00: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
cd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
cd20: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
cd30: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
cd40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cd50: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
cd60: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
cd70: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
cd80: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd90: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
cda0: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
cdb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cdc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cdd0: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
cde0: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
cdf0: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
ce00: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
ce10: 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
ce20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
ce30: 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
ce40: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
ce50: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
ce60: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
ce70: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
ce80: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
ce90: 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
cea0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
ceb0: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
cec0: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
ced0: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
cee0: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
cef0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
cf00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
cf10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
cf20: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
cf30: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
cf40: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
cf50: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
cf60: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
cf70: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
cf80: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
cf90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
cfa0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
cfb0: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
cfc0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
cfd0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
cfe0: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  tmtSize);.  }.  
cff0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d000: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
d010: 52 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  RED );.  pPager-
d020: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
d030: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
d040: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
d050: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
d060: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
d070: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
d080: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d090: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
d0a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d0b0: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
d0c0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
d0d0: 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  tfd, 0);.  nRec 
d0e0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
d0f0: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
d100: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
d110: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
d120: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
d130: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
d140: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
d150: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
d160: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
d170: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
d180: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
d190: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
d1a0: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
d1b0: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
d1c0: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
d1d0: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
d1e0: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
d1f0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
d200: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
d210: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d220: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d230: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
d240: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
d250: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
d260: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d270: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
d280: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d290: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
d2a0: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
d2b0: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
d2c0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
d2d0: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
d2e0: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
d2f0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
d300: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
d310: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
d320: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
d330: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
d340: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
d350: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
d360: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
d370: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
d380: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
d390: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
d3a0: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
d3b0: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
d3c0: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
d3d0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
d3e0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
d3f0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
d400: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
d410: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
d420: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
d430: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
d440: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
d450: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
d460: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
d470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d480: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
d490: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d4a0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
d4b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
d4c0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
d4d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d4e0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
d4f0: 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
d500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d510: 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
d520: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d530: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d540: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d550: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
d560: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d570: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
d580: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d590: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d5a0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
d5b0: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
d5c0: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
d5d0: 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
d5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d5f0: 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
d600: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
d610: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
d620: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
d630: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
d640: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
d650: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
d670: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d680: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
d690: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d6a0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
d6b0: 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
d6c0: 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
d6d0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
d6e0: 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
d6f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
d700: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
d710: 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
d720: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
d730: 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
d740: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
d750: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
d760: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
d770: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
d780: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
d790: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
d7a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d7b0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d7c0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
d7e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d7f0: 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
d800: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
d810: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d820: 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
d830: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d840: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
d850: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
d860: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
d870: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d880: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
d890: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
d8a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
d8b0: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
d8c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d8d0: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
d8e0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
d8f0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
d900: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
d910: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d920: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
d930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d940: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
d950: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
d960: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
d970: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
d980: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
d990: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
d9a0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
d9b0: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
d9c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
d9d0: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
d9e0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d9f0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
da00: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
da10: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
da20: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
da30: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
da40: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
da50: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
da60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
da70: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
da80: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
da90: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
daa0: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
dab0: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
dac0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
dad0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
daf0: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
db00: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
db10: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
db20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
db30: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
db40: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
db50: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
db60: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
db70: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
db80: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
db90: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
dba0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
dbc0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
dbd0: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
dbe0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
dbf0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
dc00: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
dc10: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
dc20: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
dc30: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
dc40: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
dc50: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
dc60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
dc70: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
dc80: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
dc90: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
dca0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
dcb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dcc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
dcd0: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
dce0: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
dcf0: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
dd00: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
dd10: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
dd20: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
dd40: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
dd50: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
dd60: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
dd70: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
dd80: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
dd90: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
dda0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
ddb0: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
ddd0: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
dde0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
ddf0: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
de00: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
de10: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
de20: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
de30: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
de40: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
de50: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
de60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de70: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
de80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
de90: 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
dea0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
deb0: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
dec0: 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
ded0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
dee0: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
def0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
df00: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
df10: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
df20: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
df30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
df40: 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73  _fsync = full_fs
df50: 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ync;.  if( pPage
df60: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
df70: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
df80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
df90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
dfa0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
dfb0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
dfc0: 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
dfd0: 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
dfe0: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
dff0: 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
e000: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
e010: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
e020: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
e030: 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
e040: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
e050: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
e060: 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
e070: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
e080: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
e090: 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  e. .**.** Write 
e0a0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
e0b0: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
e0c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
e0d0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
e0e0: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
e0f0: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
e100: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
e110: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
e120: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
e130: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
e140: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
e150: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e160: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e170: 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70  ntemp(OsFile **p
e180: 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  Fd){.  int cnt =
e190: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   8;.  int rc;.  
e1a0: 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54  char zFile[SQLIT
e1b0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
e1c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e1d0: 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
e1e0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
e1f0: 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
e200: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
e210: 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
e220: 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  if.  do{.    cnt
e230: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
e240: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
e250: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
e260: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
e270: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64  usive(zFile, pFd
e280: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
e290: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
e2a0: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
e2b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
e2c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e2d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
e2e0: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
e2f0: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
e300: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
e310: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
e320: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
e330: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
e340: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
e350: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
e360: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
e370: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
e380: 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
e390: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
e3a0: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
e3b0: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
e3c0: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
e3d0: 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
e3e0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
e3f0: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
e400: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
e410: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
e420: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
e430: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
e440: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
e450: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
e460: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
e470: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
e480: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
e490: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
e4a0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
e4b0: 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
e4c0: 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
e4d0: 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
e4e0: 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
e4f0: 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
e500: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
e510: 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
e520: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
e530: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
e540: 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  erOpen(.  Pager 
e550: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
e560: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
e570: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
e580: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
e590: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e5a0: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
e5b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e5c0: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
e5d0: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
e5e0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
e5f0: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
e600: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
e610: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
e620: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
e630: 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
e640: 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
e650: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
e660: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68  pPager = 0;.  ch
e670: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e680: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
e690: 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c  eLen;  /* Compil
e6a0: 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69  er is wrong. Thi
e6b0: 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  s is always init
e6c0: 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75  ialized before u
e6d0: 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  se */.  OsFile *
e6e0: 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fd;.  int rc = S
e6f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
e700: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
e710: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
e720: 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
e730: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
e740: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
e750: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
e760: 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
e770: 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
e780: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
e790: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
e7a0: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
e7b0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
e7c0: 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51  SIZE];.#ifdef SQ
e7d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
e7e0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
e7f0: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
e800: 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
e810: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e820: 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
e830: 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
e840: 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
e850: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
e860: 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
e870: 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
e880: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
e890: 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
e8a0: 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
e8b0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
e8c0: 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
e8d0: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
e8e0: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
e8f0: 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77  can be set. It w
e900: 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20  ould be nice to 
e910: 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74  assert.  ** that
e920: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e930: 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  oc is non-zero, 
e940: 62 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72  but alas this br
e950: 65 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20  eaks test cases 
e960: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
e970: 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65   invoke the page
e980: 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f  r directly..  */
e990: 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
e9a0: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
e9b0: 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
e9c0: 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e  ert( pTsd );.#en
e9d0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c  dif..  /* If mal
e9e0: 6c 6f 63 28 29 20 68 61 73 20 61 6c 72 65 61 64  loc() has alread
e9f0: 79 20 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20  y failed return 
ea00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65  SQLITE_NOMEM. Be
ea10: 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74  fore even.  ** t
ea20: 65 73 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c  esting for this,
ea30: 20 73 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f   set *ppPager to
ea40: 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c   NULL so the cal
ea50: 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61  ler knows the pa
ea60: 67 65 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ger.  ** structu
ea70: 72 65 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c  re was never all
ea80: 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  ocated. .  */.  
ea90: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
eaa0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
eab0: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
eac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ead0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
eae0: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
eaf0: 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70  f(fd));..  /* Op
eb00: 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
eb10: 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50  e and set zFullP
eb20: 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74  athname to point
eb30: 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a   at malloc()ed .
eb40: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74    ** memory cont
eb50: 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c  aining the compl
eb60: 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e  ete filename (i.
eb70: 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e. including the
eb80: 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a   directory)..  *
eb90: 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
eba0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
ebb0: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
ebc0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
ebd0: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
ebe0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
ebf0: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
ec00: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
ec10: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
ec20: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
ec30: 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ("");.    }else.
ec40: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
ec50: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
ec60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ec70: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
ec80: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
ec90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
eca0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ecb0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
ecc0: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
ecd0: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
ece0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
ecf0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ed00: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ed10: 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20  Opentemp(&fd);. 
ed20: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
ed30: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
ed40: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
ed50: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
ed60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ed70: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
ed80: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ed90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
eda0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
edb0: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
edc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
edd0: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
ede0: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
edf0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
ee00: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
ee10: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
ee20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
ee30: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
ee40: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
ee50: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
ee60: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
ee70: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
ee80: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
ee90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
eea0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
eeb0: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
eec0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
eed0: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
eee0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
eef0: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
ef00: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
ef10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20  .    if( pPager 
ef20: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
ef30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
ef40: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
ef50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
ef60: 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46  ocRaw(SQLITE_DEF
ef70: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
ef80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
ef90: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
efa0: 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
efb0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
efc0: 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65  ove, free the me
efd0: 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  mory .  ** point
efe0: 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61  ed to by zFullPa
eff0: 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65  thname, free the
f000: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
f010: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a   and close the .
f020: 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65    ** file. Since
f030: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
f040: 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
f050: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
f060: 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
f070: 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
f080: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
f090: 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46  ( !pPager || !zF
f0a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21  ullPathname || !
f0b0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f0c0: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
f0d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f0e0: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
f0f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
f100: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f110: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
f120: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f130: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
f140: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
f150: 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  c);.  }..  TRACE
f160: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
f170: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
f180: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
f190: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
f1a0: 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
f1b0: 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68  Pager, zFullPath
f1c0: 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d  name)).  pPager-
f1d0: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
f1e0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
f1f0: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
f200: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
f210: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
f220: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
f230: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
f240: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
f250: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
f260: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
f270: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
f280: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
f290: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f2a0: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
f2b0: 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  e);..  for(i=nam
f2c0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
f2d0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f2e0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
f2f0: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
f300: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
f310: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
f320: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
f330: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
f340: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
f350: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f360: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
f370: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
f380: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
f390: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
f3a0: 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
f3b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f3c0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f3d0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
f3e0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
f3f0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f400: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
f410: 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
f420: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f430: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
f440: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f450: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
f460: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f470: 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
f480: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
f490: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
f4a0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
f4b0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
f4c0: 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
f4d0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
f4e0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f4f0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
f500: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f510: 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
f520: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78   /* pPager->nMax
f530: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
f540: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
f550: 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50  100;.  assert( P
f560: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29  AGER_UNLOCK==0 )
f570: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
f580: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
f590: 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
f5a0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
f5b0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
f5c0: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
f5d0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
f5e0: 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
f5f0: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
f600: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
f610: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
f620: 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
f630: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
f640: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
f650: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
f660: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f670: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
f680: 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50  nc?0:1);.  /* pP
f690: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
f6a0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f6b0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
f6c0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f6d0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
f6e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
f6f0: 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
f700: 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
f710: 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62  assert(fd||memDb
f720: 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
f730: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
f740: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
f750: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
f760: 66 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  fd);.  }.  /* pP
f770: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
f780: 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
f790: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
f7a0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
f7b0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
f7c0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
f7d0: 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
f7e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
f7f0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
f800: 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20    pPager->pNext 
f810: 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a  = pTsd->pPager;.
f820: 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
f830: 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a   pPager;.#endif.
f840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f850: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
f860: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
f870: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
f880: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
f890: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
f8a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
f8b0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
f8c0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
f8d0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
f8e0: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
f8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f900: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
f910: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
f920: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
f930: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
f940: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
f950: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
f960: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
f970: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
f980: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
f990: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
f9a0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
f9b0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
f9c0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
f9d0: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
f9e0: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
f9f0: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
fa00: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
fa10: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
fa20: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
fa30: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
fa40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
fa50: 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
fa60: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fa70: 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
fa80: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
fa90: 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
faa0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
fab0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
fac0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
fad0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
fae0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
faf0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
fb00: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
fb10: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
fb20: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
fb30: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
fb40: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
fb50: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
fb60: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
fb70: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
fb80: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
fb90: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
fba0: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
fbb0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
fbc0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
fbd0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
fbe0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
fbf0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
fc00: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
fc10: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
fc20: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
fc30: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
fc40: 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
fc50: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
fc60: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
fc70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
fc80: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
fc90: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
fca0: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
fcb0: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
fcc0: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
fcd0: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
fce0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
fcf0: 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
fd00: 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
fd10: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fd20: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
fd30: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
fd40: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
fd50: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
fd60: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
fd70: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
fd80: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
fd90: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
fda0: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
fdb0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
fdc0: 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
fdd0: 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  3ReallocOrFree((
fde0: 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
fdf0: 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65  >pTmpSpace, page
fe00: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
fe10: 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
fe20: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
fe30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
fe40: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
fe50: 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
fe60: 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
fe70: 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
fe80: 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
fe90: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
fea0: 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
feb0: 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
fec0: 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
fed0: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
fee0: 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
fef0: 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
ff00: 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
ff10: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
ff20: 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
ff30: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
ff40: 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
ff50: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
ff60: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
ff70: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
ff80: 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
ff90: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
ffa0: 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
ffb0: 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c  ved_cnt;.void cl
ffc0: 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
ffd0: 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69  _error(){.  sqli
ffe0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
fff0: 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73   = 0;.}.void dis
10000 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10010 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
10020 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
10030 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
10040 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
10050 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10060 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
10070 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
10080 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
10090 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
100a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
100b0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
100c0 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72  e.# define clear
100d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
100e0 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64  ror().# define d
100f0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10100 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
10110 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
10120 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10130 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
10140 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
10150 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
10160 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
10170 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
10180 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
10190 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
101a0 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  ** No error chec
101b0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68  king is done. Th
101c0 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74  e rational for t
101d0 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
101e0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61   function .** ma
101f0 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e  y be called even
10200 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
10210 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
10220 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e  ontain a header.
10230 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61   In .** these ca
10240 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ses sqlite3OsRea
10250 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  d() will return 
10260 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69  an error, to whi
10270 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a  ch the correct .
10280 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74  ** response is t
10290 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72  o zero the memor
102a0 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63  y at pDest and c
102b0 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c  ontinue.  A real
102c0 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69   IO error .** wi
102d0 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65  ll presumably re
102e0 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65  cur and be picke
102f0 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f  d up later (Todo
10300 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  : Think about th
10310 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  is)..*/.int sqli
10320 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
10330 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
10340 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
10350 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
10360 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
10370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
10380 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
10390 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
103a0 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  ){.    disable_s
103b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
103c0 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
103d0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
103e0 66 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62  fd, 0);.    enab
103f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10400 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f  errors();.    IO
10410 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
10420 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
10430 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
10440 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
10450 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
10460 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  N);.    if( rc==
10470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
10480 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
10490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
104a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
104b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
104c0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
104d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
104e0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
104f0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10500 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
10510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
10520 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
10530 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
10540 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
10550 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
10560 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
10570 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
10580 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
10590 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
105a0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
105b0 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
105c0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
105d0 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
105e0 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
105f0 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
10600 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
10610 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
10620 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10630 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
10640 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
10650 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   n;.  int rc;.  
10660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
10670 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
10680 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
10690 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
106a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
106b0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
106c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
106d0 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
106e0 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69    if( (rc = sqli
106f0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10700 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
10710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10720 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
10730 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
10740 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10750 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
10760 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
10770 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
10780 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
10790 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
107a0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
107b0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
107c0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
107d0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
107e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
107f0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
10800 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
10810 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
10820 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
10830 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
10840 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
10860 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
10870 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
10880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10890 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
108a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
108b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
108c0 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
108d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
108e0 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d  pStmt);.  pHist-
108f0 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48  >pOrig = 0;.  pH
10900 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
10910 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10920 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a  clearHistory(x).
10930 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
10940 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
10950 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
10960 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
10970 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  r*);../*.** Unli
10980 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
10990 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
109a0 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
109b0 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
109c0 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
109d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
109e0 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
109f0 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
10a00 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
10a10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
10a20 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f  gerMovepage() ro
10a30 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
10a40 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
10a50 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
10a60 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
10a70 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
10a80 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
10a90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10aa0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
10ab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
10ac0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
10ad0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
10ae0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10af0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
10b00 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
10b10 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  h==0 );.    retu
10b20 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
10b30 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
10b40 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
10b50 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
10b60 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
10b70 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10b80 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
10b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10ba0 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20  aHash[pPg->pgno 
10bb0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
10bc0 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20  -1)]!=pPg );.   
10bd0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
10be0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
10bf0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
10c00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
10c10 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  = pPg->pgno & (p
10c20 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
10c30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
10c40 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
10c50 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  xtHash;.  }.  if
10c60 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63  ( MEMDB ){.    c
10c70 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
10c80 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
10c90 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70  Pager));.  }.  p
10ca0 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
10cb0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
10cc0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
10cd0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
10ce0 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
10cf0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
10d00 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
10d10 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
10d20 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
10d30 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
10d40 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
10d50 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
10d60 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
10d70 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
10d80 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
10d90 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20  ..  /* Keep the 
10da0 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69  pFirstSynced poi
10db0 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  nter pointing at
10dc0 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68   the first synch
10dd0 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a  ronized page */.
10de0 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
10df0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10e00 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
10e10 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10e20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  ;.    while( p &
10e30 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
10e40 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
10e50 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d  e; }.    pPager-
10e60 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
10e70 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  p;.  }..  /* Unl
10e80 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ink from the fre
10e90 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70  elist */.  if( p
10ea0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
10eb0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
10ec0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
10ed0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10ee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
10ef0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
10f00 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irst==pPg );.   
10f10 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
10f20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10f30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10f40 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
10f50 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10f60 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
10f70 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
10f80 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10f90 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
10fa0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10fb0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
10fc0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
10fd0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  .  pPg->pNextFre
10fe0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
10ff0 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e  ee = 0;..  /* Un
11000 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
11010 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
11020 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
11030 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
11040 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11050 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11060 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11070 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
11080 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65  runcate an in-me
11090 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
110a0 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61  Delete.** all pa
110b0 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
110c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
110d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
110e0 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
110f0 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
11100 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
11110 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
11120 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
11130 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
11140 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
11150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
11160 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
11170 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
11180 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
11190 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
111a0 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
111b0 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
111c0 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
111d0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
111e0 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
111f0 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
11200 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
11210 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
11220 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
11230 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
11240 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
11250 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
11260 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
11270 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
11280 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
11290 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
112a0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
112b0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61  e(pPg);.      ma
112c0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
112d0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
112e0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
112f0 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
11300 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
11310 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
11320 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
11330 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
11340 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
11350 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
11360 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
11370 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
11380 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
11390 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
113a0 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
113b0 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
113c0 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
113d0 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
113e0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
113f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
11400 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
11410 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
11420 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
11430 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
11440 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11450 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
11460 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11470 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
11480 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
11490 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
114a0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
114b0 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
114c0 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
114d0 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
114e0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
114f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
11500 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
11510 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
11520 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
11530 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
11540 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
11550 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
11560 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
11570 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
11580 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
11590 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
115a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
115b0 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
115c0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
115d0 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
115e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
115f0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
11600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
11620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11630 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
11640 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
11650 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11660 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
11670 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
11680 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
11690 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
116a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
116b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
116c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
116d0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
116e0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
116f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
11700 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
11710 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11720 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
11730 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
11740 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
11750 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
11760 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11770 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
11780 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11790 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
117a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
117b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
117c0 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
117d0 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
117e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
117f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
11800 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
11810 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
11820 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
11830 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
11840 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
11850 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
11860 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
11870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11880 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
11890 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
118a0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d  e = nPage;.    m
118b0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
118c0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
118d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
118e0 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
118f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
11900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11920 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
11930 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
11940 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
11950 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
11960 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
11970 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
11980 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
11990 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
119a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
119b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
119c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
119d0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
119e0 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69  ger, nPage);.  i
119f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11a00 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11a10 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
11a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
11a40 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
11a50 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
11a60 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
11a70 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
11a80 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11a90 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
11aa0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
11ab0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
11ac0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
11ad0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11ae0 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
11af0 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
11b00 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
11b10 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
11b20 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
11b30 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
11b40 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
11b50 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
11b60 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
11b70 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11b80 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
11b90 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
11ba0 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
11bb0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
11bc0 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
11bd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
11be0 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
11bf0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
11c00 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
11c10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
11c20 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
11c30 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
11c40 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
11c50 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
11c60 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
11c70 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
11c80 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
11c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11ca0 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
11cb0 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51  ager){.#ifdef SQ
11cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
11cd0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
11ce0 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
11cf0 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
11d00 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
11d10 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
11d20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
11d30 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
11d40 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
11d50 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
11d60 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
11d70 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
11d80 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
11d90 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
11da0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
11db0 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
11dc0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
11dd0 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
11de0 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  can be set..  */
11df0 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
11e00 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
11e10 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
11e20 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20  ert( pPager );. 
11e30 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26   assert( pTsd &&
11e40 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b   pTsd->nAlloc );
11e50 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
11e60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
11e70 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67  errors();.  pPag
11e80 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
11e90 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
11ea0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
11eb0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
11ec0 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  er);.  pagerUnlo
11ed0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
11ee0 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  ager);.  enable_
11ef0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11f00 6f 72 73 28 29 3b 0a 20 20 54 52 41 43 45 32 28  ors();.  TRACE2(
11f10 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
11f20 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
11f30 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
11f40 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
11f50 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
11f60 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
11f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11f80 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
11f90 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
11fa0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11fb0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
11fc0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11fd0 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
11fe0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
11ff0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
12000 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
12010 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
12020 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
12030 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
12040 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
12050 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
12060 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
12070 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
12080 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
12090 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
120a0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
120b0 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
120c0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
120d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
120e0 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
120f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12100 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
12110 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  GEMENT.  /* Remo
12120 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f  ve the pager fro
12130 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  m the linked lis
12140 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72  t of pagers star
12150 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68  ting at .  ** Th
12160 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20  readData.pPager 
12170 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
12180 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e  ment is enabled.
12190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
121a0 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
121b0 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
121c0 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
121d0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
121e0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
121f0 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
12200 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
12210 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
12220 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
12230 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e  xt){}.    pTmp->
12240 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
12250 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  pNext;.  }.#endi
12260 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  f.  sqliteFree(p
12270 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
12280 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12290 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
122a0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
122b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
122c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
122d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
122e0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
122f0 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
12300 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
12310 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
12320 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
12330 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
12340 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
12350 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
12360 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
12370 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12380 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
12390 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
123a0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
123b0 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
123c0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
123d0 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
123e0 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
123f0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
12400 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
12410 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
12420 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
12430 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
12440 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
12450 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
12460 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
12470 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
12480 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
12490 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
124a0 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
124b0 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
124c0 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
124d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
124e0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
124f0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12500 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
12510 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
12520 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12530 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
12540 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
12550 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
12560 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12570 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
12580 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12590 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
125a0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
125b0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
125c0 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
125d0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
125e0 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
125f0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12600 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12610 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12620 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12630 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12650 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12660 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12670 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12680 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
12690 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
126a0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
126b0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
126c0 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
126d0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
126e0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
126f0 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12700 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12710 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12720 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12730 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12740 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12750 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12760 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12770 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
12780 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12790 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
127a0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
127b0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
127c0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
127d0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
127e0 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
127f0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12800 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12810 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12820 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12830 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12840 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12850 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12860 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12870 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
12880 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
12890 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
128a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
128b0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
128c0 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  ){.  page_ref(pP
128d0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
128e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
128f0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12900 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
12910 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
12920 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
12930 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
12940 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
12950 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
12960 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
12970 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
12980 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
12990 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
129a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
129b0 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
129c0 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
129d0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
129e0 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
129f0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12a00 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
12a10 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
12a20 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
12a30 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
12a40 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
12a50 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
12a60 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
12a70 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
12a80 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
12a90 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
12aa0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
12ab0 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
12ac0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
12ad0 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
12ae0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12af0 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
12b00 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
12b10 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
12b20 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
12b30 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
12b40 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
12b50 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
12b60 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
12b70 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
12b80 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
12b90 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
12ba0 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
12bb0 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
12bc0 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
12bd0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
12be0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
12bf0 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
12c00 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
12c10 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
12c20 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
12c30 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
12c40 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
12c50 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
12c60 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12c70 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
12c80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12c90 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
12ca0 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
12cb0 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
12cc0 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
12cd0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
12ce0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
12cf0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
12d00 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
12d10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d20 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
12d30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
12d40 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
12d50 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
12d60 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
12d70 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
12d80 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
12d90 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
12da0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12db0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
12dc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
12dd0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
12de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12df0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
12e00 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
12e10 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
12e20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
12e30 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
12e40 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
12e50 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
12e60 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
12e70 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
12e80 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
12e90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
12ea0 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
12eb0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
12ec0 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
12ed0 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
12ee0 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
12ef0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
12f00 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
12f10 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
12f20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12f30 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
12f40 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
12f50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12f60 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
12f70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
12f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12f90 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
12fa0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12fb0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12fc0 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
12fd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12fe0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
12ff0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
13000 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
13010 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
13020 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
13030 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
13040 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
13050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
13060 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
13070 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
13080 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
13090 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
130a0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
130b0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
130c0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
130d0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
130e0 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
130f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
13100 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
13110 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
13120 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
13130 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
13140 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
13150 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
13160 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
13170 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
13180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13190 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
131a0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
131b0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
131c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
131d0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
131e0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
131f0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13220 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
13230 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
13240 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
13250 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13260 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
13270 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
13280 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20  d\n", pPager,.  
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
132b0 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
132c0 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a  rnalMagic), 4)).
132d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
132e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
132f0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
13300 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
13310 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13320 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
13330 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
13340 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
13350 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
13360 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
13370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13380 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
13390 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
133a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
133b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
133c0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
133d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %d\n", pPager)).
133e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
133f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13400 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
13410 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20  ll_fsync);.     
13420 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
13430 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50  urn rc;.      pP
13440 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
13450 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
13460 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
13470 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
13480 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
13490 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
134a0 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
134b0 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  /.    for(pPg=pP
134c0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
134d0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
134e0 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
134f0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
13500 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
13510 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
13520 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
13530 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
13540 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
13550 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
13560 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
13570 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
13580 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
13590 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
135a0 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
135b0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
135c0 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
135d0 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
135e0 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
135f0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
13600 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
13610 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
13620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
13630 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
13640 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
13650 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13660 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  ed==pPager->pFir
13670 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  st );.  }.#endif
13680 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
13690 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77  ../*.** Merge tw
136a0 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73  o lists of pages
136b0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
136c0 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f  irty and in pgno
136d0 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   order..** Do no
136e0 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68  t both fixing th
136f0 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69  e pPrevDirty poi
13700 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
13710 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61   PgHdr *merge_pa
13720 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41  gelist(PgHdr *pA
13730 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20  , PgHdr *pB){.  
13740 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70  PgHdr result, *p
13750 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20  Tail;.  pTail = 
13760 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65  &result;.  while
13770 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20  ( pA && pB ){.  
13780 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70    if( pA->pgno<p
13790 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  B->pgno ){.     
137a0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
137b0 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pA;.      pTail
137c0 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20   = pA;.      pA 
137d0 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pA->pDirty;.  
137e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
137f0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
13800 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  B;.      pTail =
13810 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20   pB;.      pB = 
13820 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pB->pDirty;.    
13830 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29  }.  }.  if( pA )
13840 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
13850 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73  rty = pA;.  }els
13860 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20  e if( pB ){.    
13870 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13880 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pB;.  }else{.   
13890 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
138a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
138b0 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a   result.pDirty;.
138c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68  }../*.** Sort th
138d0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
138e0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
138f0 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67  er by pgno.  Pag
13900 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63  es are.** connec
13910 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f  ted by pDirty po
13920 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72  inters.  The pPr
13930 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
13940 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65   are.** corrupte
13950 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a  d by this sort..
13960 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  */.#define N_SOR
13970 54 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61 74  T_BUCKET 25.stat
13980 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70  ic PgHdr *sort_p
13990 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
139a0 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b  In){.  PgHdr *a[
139b0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20  N_SORT_BUCKET], 
139c0 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d  *p;.  int i;.  m
139d0 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
139e0 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28  of(a));.  while(
139f0 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20   pIn ){.    p = 
13a00 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  pIn;.    pIn = p
13a10 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
13a20 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
13a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f   for(i=0; i<N_SO
13a40 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b  RT_BUCKET-1; i++
13a50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ){.      if( a[i
13a60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
13a70 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  a[i] = p;.      
13a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
13aa0 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
13ab0 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
13ac0 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
13ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13ae0 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43  f( i==N_SORT_BUC
13af0 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 61  KET-1 ){.      a
13b00 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
13b10 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
13b20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
13b30 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
13b40 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
13b50 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
13b60 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
13b70 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
13b80 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
13b90 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
13ba0 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
13bb0 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
13bc0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
13bd0 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
13be0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
13bf0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
13c00 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
13c10 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
13c20 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
13c30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
13c40 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
13c50 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
13c60 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
13c70 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69  t rc;..  if( pLi
13c80 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
13c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
13ca0 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
13cb0 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
13cc0 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
13cd0 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
13ce0 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
13cf0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
13d00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13d10 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
13d20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
13d30 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
13d40 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
13d50 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
13d60 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70  Lock() are no-op
13d70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76  s..  **.  ** Mov
13d80 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f  ing the lock fro
13d90 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58  m RESERVED to EX
13da0 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79  CLUSIVE actually
13db0 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a   involves going.
13dc0 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20    ** through an 
13dd0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
13de0 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20  te PENDING.   A 
13df0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65  PENDING lock pre
13e00 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72  vents new.  ** r
13e10 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61  eaders from atta
13e20 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  ching to the dat
13e30 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73  abase but is uns
13e40 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73  ufficient for us
13e50 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20   to.  ** write. 
13e60 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50   The idea of a P
13e70 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74  ENDING lock is t
13e80 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65  o prevent new re
13e90 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  aders from.  ** 
13ea0 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20  coming in while 
13eb0 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73  we wait for exis
13ec0 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20  ting readers to 
13ed0 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  clear..  **.  **
13ee0 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
13ef0 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52   is in the RESER
13f00 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f  VED state, the o
13f10 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
13f20 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e   file.  ** is un
13f30 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63  changed and we c
13f40 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68  an rollback with
13f50 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c  out having to pl
13f60 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20  ayback the.  ** 
13f70 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
13f80 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13f90 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77  se file.  Once w
13fa0 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a  e transition to.
13fb0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20    ** EXCLUSIVE, 
13fc0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  it means the dat
13fd0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
13fe0 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20  een changed and 
13ff0 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  any rollback.  *
14000 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  * will require a
14010 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
14020 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  k..  */.  rc = p
14030 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
14040 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
14050 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
14060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14080 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20  .  }..  pList = 
14090 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c  sort_pagelist(pL
140a0 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ist);.  while( p
140b0 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65  List ){.    asse
140c0 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79  rt( pList->dirty
140d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
140e0 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
140f0 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70  r->fd, (pList->p
14100 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
14110 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14120 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
14130 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66  rn rc;.    /* If
14140 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
14150 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
14160 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
14170 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
14180 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
14190 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
141a0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
141b0 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
141c0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
141d0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
141e0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
141f0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
14200 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
14210 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
14220 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
14230 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
14240 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
14250 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
14260 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
14270 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
14280 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
14290 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
142a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
142b0 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
142c0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
142d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
142e0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
142f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
14300 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
14310 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
14320 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  ist->pgno)).    
14330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14340 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
14350 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
14360 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14370 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14380 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
14390 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
143a0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
143b0 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
143c0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
143d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
143e0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
143f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14400 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14410 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
14420 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
14430 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14440 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
14450 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
14460 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
14470 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
14480 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
14490 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
144a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
144b0 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
144c0 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
144d0 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
144e0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
144f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
14500 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
14510 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
14520 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
14530 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
14540 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
14550 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
14560 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
14570 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
14580 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
14590 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
145a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
145b0 20 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69   TRUE if there i
145c0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
145d0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
145e0 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
145f0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
14600 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
14610 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
14620 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
14630 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
14640 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
14650 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
14660 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
14670 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
14680 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
14690 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
146a0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
146b0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
146c0 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
146d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
146e0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
146f0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
14700 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
14710 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
14720 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
14730 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46   if( !sqlite3OsF
14740 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
14750 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65  ->zJournal) ) re
14760 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
14770 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
14780 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
14790 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
147a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
147b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
147c0 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ger)==0 ){.    s
147d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
147e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
147f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
14810 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
14820 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
14830 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
14840 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
14850 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
14860 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
14870 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
14880 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
14890 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
148a0 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
148b0 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
148c0 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
148d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
148e0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
148f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14900 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20  t syncOk, PgHdr 
14910 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
14920 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
14930 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61   0;..  /* Find a
14940 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
14950 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65  .  Try to locate
14960 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
14970 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69  s not.  ** requi
14980 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66  re us to do an f
14990 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f  sync() on the jo
149a0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50  urnal..  */.  pP
149b0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
149c0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
149d0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
149e0 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
149f0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
14a00 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
14a10 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
14a20 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
14a30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14a40 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
14a50 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
14a60 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
14a70 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
14a80 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
14a90 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
14aa0 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
14ab0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
14ac0 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
14ad0 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d   && syncOk && !M
14ae0 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72  EMDB){.    int r
14af0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
14b00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
14b10 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
14b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14b30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14b40 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
14b50 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
14b60 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
14b70 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
14b80 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
14b90 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
14ba0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
14bb0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
14bc0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
14bd0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
14be0 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
14bf0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
14c00 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
14c10 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
14c20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
14c30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
14c40 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
14c50 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
14c60 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
14c70 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
14c80 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
14c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14ca0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14cb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14cc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14cd0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
14ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14cf0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
14d00 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
14d10 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14d20 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
14d30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
14d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14d50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
14d60 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
14d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
14d80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
14d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14da0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
14db0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
14dc0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
14dd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14de0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
14df0 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
14e00 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
14e10 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
14e20 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
14e30 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
14e40 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
14e50 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
14e60 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
14e70 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
14e80 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14e90 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
14ea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14ec0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
14ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
14ee0 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  dirty==0 );..  /
14ef0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
14f00 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
14f10 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
14f20 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
14f30 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c  .  ** set the gl
14f40 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
14f50 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
14f60 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a  isabling the.  *
14f70 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f  * sqlite_dont_ro
14f80 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
14f90 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
14fa0 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
14fb0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
14fc0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
14fd0 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
14fe0 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
14ff0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
15000 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
15010 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
15020 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
15030 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
15040 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
15050 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
15060 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15070 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
15080 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
15090 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
150a0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
150b0 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
150c0 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
150d0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
150e0 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
150f0 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
15100 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
15110 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
15120 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
15130 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
15140 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
15150 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
15160 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
15170 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
15180 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
15190 0a 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61  .  TEST_INCR(pPa
151a0 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20  ger->nOvfl);..  
151b0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
151c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
151d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
151e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
151f0 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
15200 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
15210 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
15220 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
15230 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
15240 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
15250 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
15260 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
15270 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
15280 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
15290 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
152a0 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
152b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
152c0 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
152d0 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
152e0 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
152f0 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
15300 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
15310 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
15320 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
15330 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
15340 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
15350 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15360 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
15370 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
15380 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
15390 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  eased..*/.#ifdef
153a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
153b0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
153c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
153d0 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
153e0 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
153f0 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
15400 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
15410 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
15420 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a  ();.  Pager *p;.
15430 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
15440 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
15450 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67   /* If the the g
15460 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68  lobal mutex is h
15470 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75  eld, this subrou
15480 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20  tine becomes a. 
15490 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62   ** o-op; zero b
154a0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ytes of memory a
154b0 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  re freed.  This 
154c0 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  is because.  ** 
154d0 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65  some of the code
154e0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73   invoked by this
154f0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
15500 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f  so.  ** try to o
15510 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  btain the mutex,
15520 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
15530 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  deadlock..  */. 
15540 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e   if( sqlite3OsIn
15550 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20  Mutex(0) ){.    
15560 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
15570 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
15580 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
15590 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
155a0 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
155b0 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
155c0 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
155d0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
155e0 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
155f0 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
15600 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
15610 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
15620 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
15630 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
15640 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
15650 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
15660 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
15670 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
15680 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
15690 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
156a0 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
156b0 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
156c0 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
156d0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
156e0 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
156f0 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
15700 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
15710 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
15720 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
15730 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
15740 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
15750 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
15760 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
15770 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
15780 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
15790 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
157a0 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
157b0 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
157c0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
157d0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
157e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
157f0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
15800 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
15810 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
15820 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
15830 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
15840 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
15850 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
15860 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
15870 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
15880 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
15890 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
158a0 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
158b0 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
158c0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
158d0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
158e0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
158f0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
15900 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
15910 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
15920 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
15930 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
15940 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
15950 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
15960 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
15970 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
15980 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
15990 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
159a0 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
159b0 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
159c0 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
159d0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
159e0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
159f0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
15a00 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
15a10 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
15a20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
15a30 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
15a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15a50 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
15a60 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
15a70 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
15a80 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
15a90 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
15aa0 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
15ab0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
15ac0 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
15ad0 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
15ae0 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
15af0 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
15b00 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tAll;.        }.
15b10 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65          nRelease
15b20 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63  d += sqliteAlloc
15b30 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Size(pPg);.     
15b40 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
15b50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
15b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15b80 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
15b90 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
15ba0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
15bb0 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
15bc0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
15bd0 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
15be0 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
15bf0 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
15c00 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
15c10 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
15c20 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
15c30 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
15c40 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
15c50 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
15c60 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
15c70 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
15c80 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
15c90 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
15ca0 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
15cb0 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
15cc0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
15cd0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
15ce0 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
15cf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
15d00 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d  ert( (rc&0xff)==
15d10 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20  SQLITE_IOERR || 
15d20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
15d30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
15d40 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  t( p->state>=PAG
15d50 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
15d60 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
15d70 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20  or(p, rc);.     
15d80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15d90 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64  return nReleased
15da0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15db0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
15dc0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f  RY_MANAGEMENT */
15dd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15de0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15df0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
15e00 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
15e10 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
15e20 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
15e30 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
15e40 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
15e50 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
15e60 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
15e70 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
15e80 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
15e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15ea0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
15eb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
15ec0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15ed0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
15ee0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
15ef0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28  NLOCK ){.    if(
15f00 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
15f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15f20 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
15f30 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
15f40 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
15f50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15f60 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
15f70 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
15f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15fa0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15fb0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
15fc0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
15fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
15fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15ff0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
16000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
16010 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
16020 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
16030 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
16040 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
16050 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
16060 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
16070 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
16080 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
16090 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
160a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
160b0 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  f( hasHotJournal
160c0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
160d0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
160e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
160f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16100 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
16110 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a   it is.        *
16120 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
16130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16140 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
16150 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
16160 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58  he.        ** EX
16170 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
16180 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
16190 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
161a0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
161b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
161c0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
161d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
161e0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
161f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
16200 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
16210 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
16220 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
16230 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
16240 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a         ** back..
16250 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
16260 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
16270 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
16280 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
16290 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
162a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
162b0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
162c0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
162d0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
162e0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
162f0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
16300 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
16310 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16320 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
16330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16340 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
16350 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
16360 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16370 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16390 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
163a0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
163b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
163c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
163d0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
163e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
163f0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
16400 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20  XCLUSIVE;. .    
16410 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
16420 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
16430 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
16440 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
16450 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  .        ** we a
16460 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
16470 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
16480 6c 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  le. .        **.
16490 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a          ** The j
164a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
164b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
164c0 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
164d0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  The.        ** j
164e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
164f0 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
16500 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
16510 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
16520 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65        ** a write
16530 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20   lock, so there 
16540 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61  is never any cha
16550 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  nce of two or mo
16560 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  re.        ** pr
16570 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
16580 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
16590 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
165a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
165b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
165c0 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67  penReadOnly(pPag
165d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
165e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
165f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16610 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
16620 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
16630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16640 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16650 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16660 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
16670 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
16680 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
16690 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
166a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
166b0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
166c0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
166d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
166e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
166f0 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20   = 0;. .        
16700 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
16710 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
16720 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
16730 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
16740 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
16750 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
16760 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
16770 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
16780 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
16790 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
167a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
167b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
167c0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
167d0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
167e0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
167f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
16800 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
16810 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
16820 70 50 61 67 65 31 20 3d 20 70 61 67 65 72 5f 6c  pPage1 = pager_l
16830 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
16840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
16850 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20 20 20  age1 ){.        
16860 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
16870 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31  n(pPager, pPage1
16880 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
16890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
168a0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
168b0 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20 20  er, 1) );.      
168c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
168d0 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
168e0 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  r, 1, &pPage1, 0
168f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16910 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65  .  /* The change
16920 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f 72  -counter is stor
16930 65 64 20 61 74 20 6f 66 66 73 65 74 20 32 34 2e  ed at offset 24.
16940 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20 20   See also.      
16950 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
16960 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
16970 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
16980 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 43            u32 iC
16990 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74  hangeCount = ret
169a0 72 69 65 76 65 33 32 62 69 74 73 28 70 50 61 67  rieve32bits(pPag
169b0 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  e1, 24);.       
169c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
169d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  +;.          sql
169e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
169f0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
16a00 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
16a10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16a20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70 50  iChangeCount!=pP
16a30 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
16a40 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
16a50 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
16a60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
16a80 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e  ger->iChangeCoun
16a90 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e 74  t = iChangeCount
16aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16ab0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
16ac0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
16ad0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 0a  GER_SHARED;.  }.
16ae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16af0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
16b00 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
16b10 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
16b20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
16b30 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
16b40 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
16b50 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
16b60 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
16b70 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
16b80 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
16b90 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
16ba0 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
16bb0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
16bc0 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
16bd0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
16be0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
16bf0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
16c00 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
16c10 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
16c20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
16c30 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
16c40 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
16c50 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
16c60 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
16c70 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
16c80 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
16c90 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
16ca0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
16cb0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
16cc0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
16cd0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
16ce0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
16cf0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
16d00 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
16d10 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
16d20 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
16d30 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
16d40 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
16d50 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
16d60 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
16d70 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
16d80 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
16d90 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
16da0 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
16db0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
16dc0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
16dd0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
16de0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
16df0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
16e00 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
16e10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
16e20 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
16e30 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
16e40 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
16e50 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
16e60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
16e70 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
16e80 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
16e90 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
16ea0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
16eb0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
16ec0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
16ed0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
16ee0 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
16ef0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
16f00 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
16f10 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
16f20 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
16f30 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
16f40 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61  If clrFlag is fa
16f50 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
16f60 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
16f70 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
16f80 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61  sk..** If clfFla
16f90 67 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  g is true, it me
16fa0 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
16fb0 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73  about to be eras
16fc0 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74  ed and.** rewrit
16fd0 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73  ten without firs
16fe0 74 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20  t being read so 
16ff0 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
17000 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68  t it doing.** th
17010 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69  e disk I/O..*/.i
17020 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
17030 63 71 75 69 72 65 28 50 61 67 65 72 20 2a 70 50  cquire(Pager *pP
17040 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
17050 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
17060 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a  , int clrFlag){.
17070 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
17080 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
17090 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
170a0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
170b0 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
170c0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
170d0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
170e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
170f0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
17100 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
17110 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
17120 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
17130 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
17140 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
17150 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
17160 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
17170 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
17180 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
17190 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
171a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
171b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
171c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
171d0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
171e0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
171f0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
17200 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
17210 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
17220 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17230 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
17240 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
17250 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
17260 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
17280 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
17290 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
172a0 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
172b0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
172c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
172d0 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
172e0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
172f0 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
17300 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
17310 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
17320 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
17330 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
17340 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17350 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17360 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
17370 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
17380 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
17390 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
173a0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
173b0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
173c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
173d0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
173e0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
173f0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
17400 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54   int h;.    TEST
17410 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
17420 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50  iss);.    if( pP
17430 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
17440 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50  er->mxPage || pP
17450 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
17460 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20 20 20  || MEMDB ||.    
17470 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70 46 69      (pPager->pFi
17480 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
17490 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
174a0 63 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  c).    ){.      
174b0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
174c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
174d0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
174e0 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
174f0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
17500 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
17510 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
17520 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61       pPager->nHa
17530 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70  sh<256 ? 256 : p
17540 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b  Pager->nHash*2);
17550 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
17560 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
17570 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17580 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
17590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
175a0 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  }.      pPg = sq
175b0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
175c0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
175d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
17600 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
17610 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
17640 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
17650 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
17660 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
17670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17680 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
17690 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
176a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
176b0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45  ));.      if( ME
176c0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  MDB ){.        m
176d0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48  emset(PGHDR_TO_H
176e0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
176f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69  , 0, sizeof(PgHi
17700 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d  story));.      }
17710 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
17720 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
17730 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
17740 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
17750 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17760 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
17770 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
17780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
17790 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72  er->nPage>pPager
177a0 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20  ->nMaxPage ){.  
177b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
177c0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d  ager->nMaxPage==
177d0 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31  (pPager->nPage-1
177e0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ) );.        pPa
177f0 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b  ger->nMaxPage++;
17800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
17810 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
17820 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
17830 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  ger, 1, &pPg);. 
17840 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17870 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
17880 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17890 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
178a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
178b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
178c0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
178d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
178e0 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
178f0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
17900 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
17910 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
17920 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
17930 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
17940 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
17950 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17960 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
17970 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
17980 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
17990 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
179a0 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
179b0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
179c0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
179d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
179e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
179f0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
17a00 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
17a10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
17a20 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
17a30 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
17a40 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
17a50 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
17a60 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
17a70 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
17a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
17a90 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
17aa0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
17ab0 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
17ac0 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
17ad0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
17ae0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
17af0 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65  g);.    pPg->nRe
17b00 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
17b10 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50  FO(pPg);..    pP
17b20 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
17b30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
17b40 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
17b50 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
17b60 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
17b70 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
17b80 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
17b90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17ba0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  rCode ){.      s
17bb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
17bc0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20  (pPg);.      rc 
17bd0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
17be0 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
17bf0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
17c00 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
17c10 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
17c20 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
17c30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17c40 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
17c50 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
17c60 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
17c70 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
17c80 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
17c90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17ca0 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  er)<(int)pgno ||
17cb0 20 4d 45 4d 44 42 0a 20 20 20 20 20 20 20 20 20   MEMDB.         
17cc0 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26 26 20 21  || (clrFlag && !
17cd0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
17ce0 6c 6c 62 61 63 6b 29 20 0a 20 20 20 20 29 7b 0a  llback) .    ){.
17cf0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
17d00 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
17d10 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
17d20 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
17d30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17d40 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20  MEMDB==0 );.    
17d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17d60 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
17d70 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
17d80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17d90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
17da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17dc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
17dd0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
17de0 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20  A(pPg),.        
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
17e10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
17e20 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
17e30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
17e40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20  pPager, pgno)). 
17e50 20 20 20 20 20 54 52 41 43 45 33 28 22 46 45 54       TRACE3("FET
17e60 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
17e70 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17e80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
17e90 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
17ea0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
17eb0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
17ec0 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
17ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
17ee0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
17ef0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
17f00 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
17f10 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
17f20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
17f30 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
17f40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17f60 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
17f70 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  ->nRead);.      
17f80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17f90 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e  Link the page in
17fa0 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68  to the page hash
17fb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20   table */.    h 
17fc0 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
17fd0 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
17fe0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
17ff0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
18000 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
18010 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
18020 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
18030 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
18040 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
18050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18060 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
18070 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
18080 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
18090 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
180a0 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  pPg;.    }..#ifd
180b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
180c0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
180d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
180e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
180f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
18100 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
18110 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
18120 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
18130 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  /.    assert(pPa
18140 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
18150 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54 45 53  gno==1);.    TES
18160 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
18170 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
18180 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
18190 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
181a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
181b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
181c0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
181d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
181e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
181f0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
18200 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
18210 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
18220 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18230 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
18240 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
18250 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
18260 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
18270 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
18280 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
18290 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
182a0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
182b0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
182c0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
182d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
182e0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
182f0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
18300 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18310 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
18320 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
18330 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
18340 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18350 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
18360 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
18370 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
18380 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
18390 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
183a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
183b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
183c0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
183d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
183e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
183f0 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  !=0 );..  if( pP
18400 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
18410 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
18420 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
18430 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
18440 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
18450 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
18460 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
18470 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
18480 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
18490 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
184a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
184b0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
184c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
184d0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
184e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
184f0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
18500 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
18510 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
18520 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
18530 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
18540 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
18550 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
18560 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
18570 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
18580 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
18590 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
185a0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
185b0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
185c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
185d0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
185e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
185f0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
18600 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18610 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
18620 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  g){..  /* Decrem
18630 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
18640 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
18650 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73   page.  */.  ass
18660 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
18670 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d   );.  pPg->nRef-
18680 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  -;.  REFINFO(pPg
18690 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
186a0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
186b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
186c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
186d0 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
186e0 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
186f0 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
18700 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
18710 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
18720 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
18730 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
18740 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
18750 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
18760 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
18770 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
18780 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
18790 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
187a0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
187b0 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
187c0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
187d0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
187e0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
187f0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
18800 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18810 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
18820 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
18830 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
18840 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
18850 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
18860 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
18870 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
18880 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
18890 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
188a0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
188b0 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
188c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
188d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
188e0 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
188f0 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
18900 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
18910 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
18920 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
18930 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
18940 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
18950 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
18960 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
18970 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
18980 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
18990 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
189a0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
189b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
189c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
189d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
189e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
189f0 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
18a00 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
18a10 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
18a20 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
18a30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18a40 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
18a50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18a60 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
18a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
18a80 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
18a90 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
18aa0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
18ab0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
18ac0 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
18ad0 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
18ae0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
18af0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
18b00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
18b10 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
18b20 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
18b30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18b40 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
18b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18b60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18b70 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
18b80 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
18b90 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
18ba0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
18bb0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
18bc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18bd0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
18be0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18bf0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
18c00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
18c10 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
18c20 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
18c30 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
18c40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18c50 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
18c60 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
18c70 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
18c80 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
18c90 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
18ca0 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
18cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
18ce0 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
18cf0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
18d00 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
18d10 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
18d20 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
18d30 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
18d40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
18d50 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
18d60 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
18d70 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
18d80 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
18d90 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
18da0 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
18db0 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
18dc0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
18dd0 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
18de0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
18df0 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
18e00 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44  >jfd, pPager->zD
18e10 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61  irectory);.  pPa
18e20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18e30 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
18e40 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
18e50 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
18e60 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
18e70 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
18e80 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
18e90 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
18ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18eb0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
18ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
18ed0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
18ee0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
18ef0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
18f00 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
18f10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
18f20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
18f30 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
18f40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18f50 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
18f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18f80 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
18f90 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
18fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
18fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
18fc0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  M ){.    rc = pa
18fd0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
18fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
18ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19010 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
19020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19030 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
19040 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
19050 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
19060 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
19070 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19080 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
19090 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
190a0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
190b0 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  as a malloc() fa
190c0 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77  ilure, then we w
190d0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69  ill not be closi
190e0 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ng the pager.   
190f0 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c   ** file. So del
19100 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ete any journal 
19110 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65  file we may have
19120 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f   just created. O
19130 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a  therwise,.    **
19140 20 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c   the system will
19150 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77   get confused, w
19160 65 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f  e have a read-lo
19170 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ck on the file a
19180 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74  nd a.    ** myst
19190 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  erious journal h
191a0 61 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  as appeared in t
191b0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20  he filesystem.. 
191c0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
191d0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
191e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
191f0 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65 72 5f  else{.    pager_
19200 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19210 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19220 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
19230 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
19240 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19250 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
19260 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
19270 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
19280 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
19290 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
192a0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 69 73 20  agerCommit() is 
192b0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
192c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
192d0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
192e0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
192f0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
19300 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
19310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19320 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
19330 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
19340 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
19350 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
19360 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
19370 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
19380 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
19390 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
193a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
193b0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
193c0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
193d0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
193e0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
193f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19400 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
19410 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
19420 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
19430 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
19440 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19450 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
19460 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
19470 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
19480 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
19490 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
194a0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
194b0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
194c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
194d0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
194e0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
194f0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
19500 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
19510 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
19520 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
19530 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
19540 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
19550 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
19560 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
19570 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
19580 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
19590 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
195a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
195b0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
195c0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
195d0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
195e0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
195f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
19600 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
19610 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
19620 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
19630 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
19640 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
19650 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
19660 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
19670 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
19680 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
19690 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
196a0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
196b0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
196c0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
196d0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
196e0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
196f0 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
19700 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
19710 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
19720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19730 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
19740 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
19750 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
19760 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
19770 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19780 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
19790 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
197a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
197b0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
197c0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
197d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
197e0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
197f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
19800 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
19810 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
19820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19830 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
19850 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
19860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19880 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
19890 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
198a0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
198b0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
198c0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
198d0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
198e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
198f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19900 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
19910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19920 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19940 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
19950 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
19960 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
19970 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19980 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
19990 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
199a0 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
199b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
199c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
199d0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
199e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
199f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
19a00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
19a10 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
19a20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
19a30 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
19a40 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
19a50 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
19a60 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
19a70 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
19a80 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
19a90 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
19aa0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
19ab0 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
19ac0 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
19ad0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
19ae0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
19af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
19b00 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
19b10 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74  open and truncat
19b20 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20  ed to 0 bytes.. 
19b30 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
19b40 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
19b50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
19b60 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
19b70 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ize==0 );.    sq
19b80 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19b90 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
19ba0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
19bb0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
19bc0 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
19bd0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
19be0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
19bf0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
19c00 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  1 );.    if( !pP
19c10 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19c20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19c50 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
19c60 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
19c70 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
19c80 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
19c90 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
19ca0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
19cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
19cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19cd0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
19ce0 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69  ge dirty.  Set i
19cf0 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e  ts dirty flag an
19d00 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  d add it to the 
19d10 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69  dirty.** page li
19d20 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
19d30 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48  id makeDirty(PgH
19d40 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
19d50 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b  pPg->dirty==0 ){
19d60 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
19d70 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
19d80 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
19d90 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
19da0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
19db0 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20  pDirty;.    if( 
19dc0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29  pPager->pDirty )
19dd0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19de0 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
19df0 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ty = pPg;.    }.
19e00 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
19e10 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
19e20 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
19e30 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
19e40 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
19e50 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
19e60 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
19e70 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
19e80 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
19e90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
19ea0 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
19eb0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
19ec0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
19ed0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
19ee0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44  .    if( pPg->pD
19ef0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
19f00 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
19f10 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72  Dirty = pPg->pPr
19f20 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  evDirty;.    }. 
19f30 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
19f40 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  vDirty ){.      
19f50 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
19f60 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
19f70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
19f80 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
19f90 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
19fa0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
19fb0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  .  }.}.../*.** M
19fc0 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
19fd0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
19fe0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
19ff0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1a000 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1a010 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1a020 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1a030 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1a040 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1a050 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1a060 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1a070 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1a080 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a090 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1a0a0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1a0b0 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1a0c0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1a0d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a0e0 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1a0f0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1a100 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1a110 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1a120 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1a130 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1a140 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1a150 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1a160 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1a170 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1a180 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1a190 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1a1a0 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1a1b0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1a1c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1a1d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1a1e0 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1a1f0 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1a200 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1a210 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1a220 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1a230 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1a240 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1a250 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1a260 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1a270 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1a280 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1a290 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1a2a0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1a2b0 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1a2c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1a2d0 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1a2e0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1a2f0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1a300 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1a310 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44  id *pData = PGHD
1a320 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
1a330 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1a340 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1a350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a360 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1a370 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1a380 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1a390 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1a3a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1a3b0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1a3c0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1a3d0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1a3e0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1a3f0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1a400 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1a410 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1a420 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
1a430 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1a440 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1a450 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1a460 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1a470 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1a480 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1a490 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1a4a0 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  /.  makeDirty(pP
1a4b0 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  g);.  if( pPg->i
1a4c0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
1a4d0 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
1a4e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1a4f0 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1a500 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1a510 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
1a520 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
1a530 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
1a540 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
1a550 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
1a560 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
1a570 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1a580 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
1a590 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
1a5a0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
1a5b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
1a5c0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
1a5d0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1a5e0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
1a5f0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
1a600 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1a610 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
1a620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a630 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1a640 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
1a650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1a660 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  gin(pPg, 0);.   
1a670 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1a690 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1a6a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a6b0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1a6c0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
1a6d0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1a6e0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1a6f0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
1a700 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a710 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1a720 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1a730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a750 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1a760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1a770 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
1a780 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
1a790 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1a7a0 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
1a7b0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1a7c0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
1a7d0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
1a7e0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
1a7f0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1a800 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
1a810 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1a820 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
1a830 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
1a840 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
1a850 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
1a860 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1a870 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1a880 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
1a890 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
1a8a0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
1a8b0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
1a8c0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1a8d0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1a8e0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1a8f0 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
1a900 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
1a910 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
1a920 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1a930 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1a940 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1a950 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1a960 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1a970 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a980 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1a990 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
1a9a0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
1a9b0 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
1a9c0 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
1a9d0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1a9e0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
1a9f0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
1aa00 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
1aa10 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
1aa20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1aa30 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
1aa40 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1aa50 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1aa60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aa70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1aa80 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
1aa90 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
1aaa0 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
1aab0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;.          /* 
1aac0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
1aad0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1aae0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
1aaf0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
1ab00 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1ab10 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
1ab20 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1ab30 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
1ab40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
1ab50 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
1ab60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1ab70 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
1ab80 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1ab90 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
1aba0 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
1abb0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1abc0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1abd0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
1abe0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1abf0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1ac00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e  );.          pEn
1ac10 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61  d = pData2 + pPa
1ac20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1ac30 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1ac40 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 4;.          
1ac50 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70  saved = *(u32*)p
1ac60 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  End;.          p
1ac70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63  ut32bits(pEnd, c
1ac80 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
1ac90 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
1aca0 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
1acb0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1acc0 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
1acd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
1ace0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1acf0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
1ad00 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20  Data2, szPg);.  
1ad10 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1ad20 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1ad30 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1ad40 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ad60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ad70 66 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20  f, szPg)).      
1ad80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1ad90 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
1ada0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 34            TRACE4
1adb0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1adc0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
1add0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ade0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1adf0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1ae00 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1ae10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
1ae20 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64  32*)pEnd = saved
1ae30 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f  ;...  /* An erro
1ae40 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72  r has occured wr
1ae50 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
1ae60 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
1ae70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61            ** tra
1ae80 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
1ae90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
1aea0 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
1aeb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1aec0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1aed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aee0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1aef0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1af00 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1af10 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
1af20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1af30 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
1af40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1af50 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1af60 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1af70 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1af80 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
1af90 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1afa0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1afb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
1afc0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1afd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1afe0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1aff0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1b000 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
1b020 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1b030 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
1b040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1b050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b060 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1b070 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
1b080 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
1b090 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1b0a0 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22          TRACE4("
1b0b0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1b0c0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1b0d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b0e0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1b0f0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1b100 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1b110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b120 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1b130 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b140 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1b150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1b160 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1b170 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1b180 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1b190 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1b1a0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1b1b0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1b1c0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1b1d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1b1e0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1b1f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1b200 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1b210 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1b220 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1b230 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1b240 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1b250 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1b260 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1b270 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1b280 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1b290 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1b2a0 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
1b2b0 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
1b2c0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1b2d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
1b2e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b2f0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1b300 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1b310 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b320 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
1b330 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1b340 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1b350 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b360 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1b370 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b380 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
1b390 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
1b3a0 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
1b3b0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1b3c0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1b3d0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1b3e0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1b3f0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
1b400 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
1b410 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1b420 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1b430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b440 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
1b450 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1b460 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b470 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1b480 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1b490 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1b4a0 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1b4b0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1b4c0 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20  ->pgno, 7)-4;.  
1b4d0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1b4e0 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
1b4f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
1b500 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b510 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
1b520 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1b530 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
1b540 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
1b550 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1b560 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b570 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1b580 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1b590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b5a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b5b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b5c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b5d0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
1b5e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b5f0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1b600 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1b610 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1b620 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1b630 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1b640 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61    }.      page_a
1b650 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1b660 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1b670 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1b680 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
1b690 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
1b6a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b6b0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1b6c0 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
1b6d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
1b6e0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
1b6f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1b700 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
1b710 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
1b720 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
1b730 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
1b740 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1b750 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1b760 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
1b770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b790 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b7a0 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
1b7b0 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
1b7c0 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
1b7d0 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
1b7e0 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1b7f0 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
1b800 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
1b810 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
1b820 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
1b830 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1b840 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1b850 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
1b860 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
1b870 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
1b880 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1b890 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
1b8a0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
1b8b0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
1b8c0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
1b8d0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
1b8e0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
1b8f0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
1b900 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
1b910 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
1b920 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1b930 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
1b940 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1b950 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
1b960 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1b970 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1b980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1b990 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1b9a0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1b9b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1b9c0 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
1b9d0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
1b9e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1b9f0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1ba00 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44  e);..  if( !MEMD
1ba10 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
1ba20 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1ba30 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1ba40 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1ba50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1ba60 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1ba70 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1ba80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba90 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1baa0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1bab0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1bac0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1bad0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1baf0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1bb00 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1bb10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  */.    int ii;..
1bb20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
1bb30 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
1bb40 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
1bb50 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
1bb60 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
1bb70 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
1bb80 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
1bb90 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
1bba0 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
1bbb0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
1bbc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bbd0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1bbe0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1bbf0 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1bc00 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1bc10 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1bc20 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1bc30 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1bc40 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1bc50 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1bc60 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1bc70 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1bc80 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1bc90 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1bca0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1bcb0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1bcc0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1bcd0 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1bce0 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1bcf0 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1bd00 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
1bd10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1bd20 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1bd30 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
1bd40 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
1bd50 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
1bd60 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
1bd70 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
1bd80 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
1bd90 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
1bda0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1bdb0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
1bdc0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
1bdd0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1bde0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
1bdf0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1be00 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
1be10 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
1be20 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
1be30 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
1be40 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
1be50 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1be60 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1be70 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
1be80 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
1be90 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  i;.      if( !pP
1bea0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1beb0 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e   || pg==pPg->pgn
1bec0 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  o || .          
1bed0 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  pg>pPager->origD
1bee0 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65  bSize || !(pPage
1bef0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1bf00 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29  /8]&(1<<(pg&7)))
1bf10 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20  .      ) {.     
1bf20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
1bf30 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1bf40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
1bf50 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
1bf60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bf70 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1bf80 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
1bf90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1bfa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bfb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1bfc0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1bfd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1bfe0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1bff0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1c000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1c010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c030 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
1c040 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1c050 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
1c060 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1c070 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
1c080 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1c090 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c0a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1c0b0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
1c0c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
1c0d0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
1c0e0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
1c0f0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
1c100 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c110 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
1c120 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
1c130 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
1c140 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
1c150 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c160 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1c170 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
1c180 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
1c190 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
1c1a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c1b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
1c1c0 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
1c1d0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1c1e0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
1c1f0 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
1c200 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
1c210 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
1c220 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c230 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  rOverwrite(Pager
1c240 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1c250 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
1c260 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1c270 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
1c280 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1c290 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1c2a0 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
1c2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c2c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c2d0 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
1c2e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c2f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
1c300 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67  emcpy(sqlite3Pag
1c310 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20  erGetData(pPg), 
1c320 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1c330 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1c340 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1c350 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  Unref(pPg);.  }.
1c360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1c370 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1c380 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1c390 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1c3a0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1c3b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1c3c0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1c3d0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1c3e0 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20   "pgno" back to 
1c3f0 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
1c400 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
1c410 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
1c420 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
1c430 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
1c440 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
1c450 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1c460 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
1c470 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
1c480 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
1c490 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
1c4a0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
1c4b0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
1c4c0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
1c4d0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
1c4e0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
1c4f0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
1c500 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
1c510 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
1c520 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
1c530 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1c540 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
1c550 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
1c560 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
1c570 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
1c580 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
1c590 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
1c5a0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
1c5b0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1c5c0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
1c5d0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1c5e0 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
1c5f0 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
1c600 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1c610 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1c620 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
1c630 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
1c640 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
1c650 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
1c660 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
1c670 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
1c680 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
1c690 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
1c6a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1c6b0 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
1c6c0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
1c6d0 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
1c6e0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
1c6f0 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
1c700 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
1c710 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
1c720 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
1c730 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1c740 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
1c750 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
1c760 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
1c770 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1c780 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
1c790 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
1c7a0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
1c7b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1c7c0 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
1c7d0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
1c7e0 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
1c7f0 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1c800 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
1c810 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1c820 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
1c830 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1c840 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1c850 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1c860 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1c870 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1c880 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1c890 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1c8a0 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1c8b0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1c8c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
1c8d0 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a  t( pPg!=0 );  /*
1c8e0 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f   We never call _
1c8f0 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73  dont_write unles
1c900 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  s the page is in
1c910 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61   mem */.  pPg->a
1c920 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1c930 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1c940 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1c950 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1c960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c970 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1c980 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1c990 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1c9a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1c9b0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1c9c0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1c9d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1c9e0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1c9f0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1ca00 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1ca10 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1ca20 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1ca30 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1ca40 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1ca50 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1ca60 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1ca70 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1ca80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1ca90 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1caa0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1cab0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1cac0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1cad0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1cae0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1caf0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1cb00 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1cb10 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1cb20 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1cb30 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1cb40 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1cb50 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1cb60 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1cb70 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1cb80 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1cb90 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1cba0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1cbb0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1cbc0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1cbd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cbe0 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
1cbf0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1cc00 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1cc10 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1cc20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
1cc30 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
1cc40 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20  Pager, pgno)).  
1cc50 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1cc60 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
1cc70 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1cc80 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1cc90 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1cca0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1ccb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ccc0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1ccd0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1cce0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1ccf0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1cd00 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1cd10 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1cd20 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1cd30 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1cd40 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1cd50 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1cd60 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1cd70 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1cd80 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1cd90 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1cda0 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
1cdb0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1cdc0 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67  back(DbPage *pPg
1cdd0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1cde0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1cdf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ce00 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1ce10 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1ce20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1ce30 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
1ce40 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
1ce50 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1ce60 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
1ce70 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
1ce80 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
1ce90 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1cea0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1ceb0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1cec0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1ced0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cee0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1cef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1cf00 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
1cf10 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1cf20 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
1cf30 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1cf40 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
1cf50 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1cf60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1cf70 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1cf80 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1cf90 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
1cfa0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1cfb0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1cfc0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1cfd0 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1cfe0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1cff0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1d000 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54  Pager));.    IOT
1d010 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
1d020 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1d030 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d   pPg->pgno)).  }
1d040 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1d050 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
1d060 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
1d070 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1d080 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
1d090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1d0a0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
1d0b0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
1d0c0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1d0d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d0e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
1d0f0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1d100 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1d110 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d120 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
1d130 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1d140 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  list(pPg);.  }.}
1d150 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
1d160 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
1d170 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1d180 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1d190 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
1d1a0 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
1d1b0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
1d1c0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
1d1d0 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
1d1e0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1d1f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
1d200 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
1d210 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
1d220 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
1d230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d240 67 65 72 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  gerCommit(Pager 
1d250 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d260 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
1d270 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1d280 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1d290 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1d2a0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1d2b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1d2c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1d2d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d2e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1d2f0 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20   TRACE2("COMMIT 
1d300 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d310 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1d320 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
1d330 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1d340 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1d350 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
1d360 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
1d370 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
1d380 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1d390 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
1d3a0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1d3b0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1d3c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1d3d0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1d3e0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1d3f0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
1d400 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1d410 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1d420 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
1d430 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1d440 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1d450 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  rty = 0;.#ifndef
1d460 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
1d470 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1d480 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1d490 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1d4a0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d4b0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1d4c0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1d4d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1d4e0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1d4f0 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
1d500 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
1d510 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
1d520 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
1d530 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
1d540 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1d550 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1d560 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d570 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1d580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d590 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d5a0 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
1d5b0 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
1d5c0 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
1d5d0 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
1d5e0 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
1d5f0 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
1d600 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
1d610 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
1d620 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1d630 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1d640 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d650 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
1d660 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1d670 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1d680 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1d690 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d6a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d6b0 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
1d6c0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1d6d0 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
1d6e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d6f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d700 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1d710 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
1d720 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d730 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
1d740 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
1d750 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
1d760 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
1d770 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
1d780 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
1d790 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
1d7a0 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
1d7b0 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
1d7c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
1d7d0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
1d7e0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
1d7f0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
1d800 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
1d810 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
1d820 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
1d830 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
1d840 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
1d850 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
1d860 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
1d870 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
1d880 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
1d890 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
1d8a0 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
1d8b0 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
1d8c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1d8d0 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
1d8e0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
1d8f0 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
1d900 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
1d910 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
1d920 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
1d930 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d940 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1d950 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1d960 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1d970 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1d980 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
1d990 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1d9a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1d9b0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
1d9c0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1d9d0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1d9e0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
1d9f0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1da00 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
1da10 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
1da20 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1da30 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
1da40 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
1da50 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1da60 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1da70 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1da80 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
1da90 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
1daa0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
1dab0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
1dac0 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
1dad0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1dae0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
1daf0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1db00 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
1db10 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1db20 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
1db30 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1db40 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
1db50 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
1db60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1db70 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42     TRACE3("ROLLB
1db80 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
1db90 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
1dba0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1dbb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dbc0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41        TRACE3("PA
1dbd0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f  GE %d is clean o
1dbe0 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  n %d\n", p->pgno
1dbf0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1dc00 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1dc10 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
1dc20 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
1dc30 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1dc40 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
1dc50 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
1dc60 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
1dc70 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
1dc80 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1dc90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1dca0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
1dcb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1dcc0 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
1dcd0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1dce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1dcf0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
1dd00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1dd10 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
1dd20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1dd30 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1dd40 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ze;.    memoryTr
1dd50 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1dd60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1dd70 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1dd80 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1dd90 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
1dda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ddb0 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
1ddc0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ddd0 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
1dde0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1ddf0 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1de00 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1de10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1de20 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1de30 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1de40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1de50 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1de60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1de70 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
1de80 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
1de90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1dea0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
1deb0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1dec0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1ded0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1dee0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
1def0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
1df00 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
1df10 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1df20 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
1df30 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1df40 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1df50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1df60 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1df70 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
1df80 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1df90 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1dfa0 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 50  er, 0);.  }.  pP
1dfb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1dfc0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
1dfd0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
1dfe0 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
1dff0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
1e000 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
1e010 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
1e020 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
1e030 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
1e040 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
1e050 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
1e060 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ent..  */.  retu
1e070 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1e080 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
1e090 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1e0a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e0b0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1e0c0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
1e0d0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
1e0e0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
1e0f0 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
1e100 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
1e110 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
1e120 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1e130 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1e140 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1e150 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e160 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1e170 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1e180 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1e190 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1e1a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e1b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1e1c0 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
1e1d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1e1e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e1f0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1e200 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1e210 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
1e220 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
1e230 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1e240 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
1e250 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
1e260 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
1e270 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
1e280 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
1e290 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
1e2a0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
1e2b0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
1e2c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
1e2d0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
1e2e0 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
1e2f0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
1e300 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
1e310 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
1e320 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
1e330 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
1e340 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
1e350 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
1e360 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
1e370 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
1e380 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1e390 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
1e3a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e3b0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
1e3c0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
1e3d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1e3e0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
1e3f0 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
1e400 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
1e410 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
1e420 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
1e430 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
1e440 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
1e450 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
1e460 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
1e470 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1e480 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1e490 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e4a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1e4b0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
1e4c0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
1e4d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1e4e0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1e4f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e500 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
1e510 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54  ;.  TRACE2("STMT
1e520 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41  -BEGIN %d\n", PA
1e530 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1e540 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1e550 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1e560 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
1e570 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
1e580 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1e590 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e5a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1e5b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1e5c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
1e5d0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1e5e0 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
1e5f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e600 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1e620 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
1e630 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1e640 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
1e650 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
1e660 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1e670 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
1e680 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1e690 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
1e6a0 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
1e6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e6c0 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
1e6d0 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
1e6e0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1e6f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1e700 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
1e710 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1e720 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1e730 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
1e740 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1e750 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
1e760 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
1e770 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
1e780 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
1e790 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
1e7a0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1e7b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1e7c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
1e7d0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
1e7e0 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
1e7f0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
1e800 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1e810 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
1e820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e830 65 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67  erOpentemp(&pPag
1e840 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
1e850 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1e860 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1e870 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1e880 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
1e890 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
1e8a0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1e8b0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
1e8c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e8d0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
1e8e0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
1e8f0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1e900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
1e910 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
1e920 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
1e930 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
1e940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e950 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1e960 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
1e970 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
1e980 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  mtCommit(Pager *
1e990 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1e9a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e9b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1e9c0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
1e9d0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
1e9e0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1e9f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1ea00 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1ea10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
1ea20 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
1ea30 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
1ea40 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1ea50 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1ea60 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
1ea70 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
1ea80 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
1ea90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1eaa0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
1eab0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1eac0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1ead0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
1eae0 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
1eaf0 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
1eb00 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
1eb10 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
1eb20 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1eb30 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1eb40 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1eb50 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
1eb60 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
1eb70 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1eb80 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1eb90 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1eba0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1ebb0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1ebc0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1ebd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1ebe0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
1ebf0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1ec00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1ec10 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
1ec20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1ec30 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1ec40 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1ec50 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1ec60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ec70 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
1ec80 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1ec90 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
1eca0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1ecb0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1ecc0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ecd0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1ece0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
1ecf0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1ed00 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1ed10 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1ed20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
1ed30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
1ed40 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1ed50 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1ed60 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
1ed70 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1ed80 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1ed90 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1eda0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1edb0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1edc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1edd0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1ede0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
1edf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1ee00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ee10 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1ee20 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
1ee30 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1ee40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ee50 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1ee60 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1ee70 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
1ee80 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1ee90 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1eea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1eeb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1eec0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
1eed0 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
1eee0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1eef0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
1ef00 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
1ef10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1ef20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ef30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1ef40 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
1ef50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ef60 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1ef70 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1ef80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ef90 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1efa0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
1efb0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1efc0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1efd0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
1efe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1eff0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
1f000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f010 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1f020 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
1f030 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
1f040 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1f050 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
1f060 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
1f070 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1f080 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
1f090 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
1f0a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1f0b0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
1f0c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1f0d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1f0e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
1f0f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1f100 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
1f110 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
1f120 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
1f130 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
1f140 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
1f150 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
1f160 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
1f170 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
1f180 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f190 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
1f1a0 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oSync;.}../*.** 
1f1b0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
1f1c0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
1f1d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1f1e0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
1f1f0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
1f200 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
1f210 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
1f220 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
1f230 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
1f240 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
1f250 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
1f260 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
1f270 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
1f280 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1f290 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1f2a0 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1f2b0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1f2c0 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1f2d0 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1f2e0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1f2f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f300 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1f310 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1f320 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
1f330 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1f340 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1f350 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
1f360 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1f370 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
1f380 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1f390 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1f3a0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
1f3b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1f3c0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
1f3d0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1f3e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f3f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1f400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f410 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
1f420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f430 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f440 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68   .    /* Read th
1f450 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1f460 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
1f470 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1f480 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
1f490 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
1f4a0 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d    .    /* Increm
1f4b0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1f4c0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1f4d0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1f4e0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1f4f0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1f500 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
1f510 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
1f520 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
1f530 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1f540 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68  .    pPager->iCh
1f550 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68 61 6e  angeCount = chan
1f560 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a 20  ge_counter;.  . 
1f570 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
1f580 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
1f590 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1f5a0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
1f5b0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1f5c0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1f5d0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1f5e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f5f0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
1f600 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1f610 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
1f620 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
1f630 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
1f640 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1f650 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1f660 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1f670 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
1f680 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
1f690 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
1f6a0 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
1f6b0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1f6c0 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
1f6d0 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
1f6e0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1f6f0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
1f700 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
1f710 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
1f720 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
1f730 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1f740 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
1f750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f760 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1f770 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
1f780 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
1f790 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
1f7a0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
1f7b0 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
1f7c0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
1f7d0 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
1f7e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1f7f0 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
1f800 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
1f810 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
1f820 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
1f830 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
1f840 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
1f850 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
1f860 33 50 61 67 65 72 53 79 6e 63 28 29 20 63 61 6c  3PagerSync() cal
1f870 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  l..**.** If para
1f880 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20  meter nTrunc is 
1f890 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
1f8a0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
1f8b0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a   truncated to.**
1f8c0 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74   nTrunc pages (t
1f8d0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
1f8e0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1f8f0 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ases)..*/.int sq
1f900 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
1f910 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
1f920 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1f930 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
1f940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f950 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34  TE_OK;..  TRACE4
1f960 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1f970 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1f980 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1f990 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1f9a0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1f9b0 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1f9c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1f9d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1f9e0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1f9f0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1fa00 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1fa10 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1fa20 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1fa30 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1fa40 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1fa50 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1fa60 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1fa70 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1fa80 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1fa90 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
1faa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1fab0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
1fac0 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
1fad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1fae0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
1faf0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1fb00 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
1fb10 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
1fb20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
1fb30 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
1fb40 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
1fb50 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
1fb60 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
1fb70 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
1fb80 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
1fb90 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1fba0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
1fbb0 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
1fbc0 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
1fbd0 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
1fbe0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
1fbf0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
1fc00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1fc10 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
1fc20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1fc30 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
1fc40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
1fc50 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1fc60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1fc70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fc80 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fc90 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1fca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fcb0 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
1fcc0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
1fcd0 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1fce0 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1fcf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1fd00 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1fd10 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
1fd20 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1fd30 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1fd40 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1fd50 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1fd60 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1fd70 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1fd80 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
1fd90 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1fda0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1fdb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1fdc0 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1fdd0 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1fde0 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1fdf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1fe00 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1fe10 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1fe20 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
1fe30 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1fe40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fe50 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
1fe60 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
1fe70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe80 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1fe90 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1fea0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1feb0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1fec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1fed0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1fee0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff00 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1ff10 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1ff20 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1ff30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1ff40 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1ff50 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1ff60 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1ff70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff80 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1ff90 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1ffa0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1ffb0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1ffc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1ffd0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1ffe0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1fff0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20000 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
20010 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
20020 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20030 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
20040 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
20050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20060 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
20070 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
20080 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
20090 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
200a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
200b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
200c0 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
200d0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
200e0 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
200f0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
20100 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
20110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20120 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
20130 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
20140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20150 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
20160 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
20170 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20180 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
20190 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  fd, 0);.    }.  
201a0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
201b0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
201c0 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ))..    pPager->
201d0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
201e0 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NCED;.  }else if
201f0 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e  ( MEMDB && nTrun
20200 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c!=0 ){.    rc =
20210 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
20220 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
20230 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63  runc);.  }..sync
20240 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
20250 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
20260 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20270 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
20280 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
20290 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f  fied by pData to
202a0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
202b0 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  n the file. .**.
202c0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
202d0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
202e0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  o the current pa
202f0 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72  ge pgno. If curr
20300 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f  ent page.** pgno
20310 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20320 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
20330 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
20340 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65  ot written there
20350 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72   by.** by this r
20360 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65  outine. The same
20370 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20   applies to the 
20380 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72  page pData refer
20390 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f  s to on entry to
203a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
203b0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
203c0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72  es to the page r
203d0 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61  efered to by pDa
203e0 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  ta remain valid.
203f0 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
20400 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
20410 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
20420 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61  pData (i.e. data
20430 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
20440 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
20450 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
20460 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
20470 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
20480 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
20490 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
204a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
204b0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
204c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
204d0 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
204e0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
204f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
20500 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
20510 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
20520 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
20530 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
20540 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
20550 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
20560 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
20570 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
20580 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
20590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
205a0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
205b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
205c0 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
205d0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
205e0 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b  PgOld; .  int h;
205f0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
20600 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
20610 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
20620 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d   );..  TRACE5("M
20630 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
20640 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
20650 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
20660 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
20670 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
20680 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
20690 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
206a0 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
206b0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
206c0 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
206d0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
206e0 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
206f0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
20700 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
20710 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
20720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20730 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
20740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20750 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
20760 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
20770 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
20780 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
20790 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
207a0 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
207b0 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
207c0 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
207d0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
207e0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
207f0 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
20800 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
20810 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
20820 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
20830 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
20840 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
20850 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
20860 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
20870 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
20880 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
20890 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
208a0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
208b0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
208c0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
208d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
208e0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
208f0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
20900 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
20910 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
20920 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
20930 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
20940 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
20950 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
20960 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
20970 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
20980 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
20990 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
209a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
209b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
209c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
209d0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
209e0 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
209f0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
20a00 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
20a10 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  hain. */.  asser
20a20 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
20a30 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
20a40 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28  ;.  h = pgno & (
20a50 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
20a60 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20a70 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
20a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20a90 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
20aa0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
20ab0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
20ac0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
20ad0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
20ae0 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
20af0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
20b00 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
20b10 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
20b20 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b  Hash = 0;..  mak
20b30 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
20b40 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20b50 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
20b60 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
20b70 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
20b80 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
20b90 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
20ba0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
20bb0 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
20bc0 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
20bd0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
20be0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
20bf0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
20c00 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
20c10 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
20c20 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
20c30 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
20c40 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
20c50 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
20c60 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
20c70 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
20c80 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
20c90 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
20ca0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
20cb0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
20cc0 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
20cd0 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
20ce0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
20cf0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
20d00 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
20d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
20d20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
20d30 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
20d40 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
20d50 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
20d60 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
20d70 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
20d80 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
20d90 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20da0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
20db0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
20dc0 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
20dd0 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
20de0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20df0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
20e00 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
20e10 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
20e20 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  gHdr->needSync =
20e30 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
20e40 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
20e50 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67     makeDirty(pPg
20e60 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
20e70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
20e80 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  dr);.  }..  retu
20e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20ea0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
20eb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20ec0 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
20ed0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
20ee0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
20ef0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
20f00 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
20f10 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
20f20 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
20f30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20f40 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
20f50 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
20f60 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
20f70 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
20f80 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
20f90 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
20fa0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
20fb0 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
20fc0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
20fd0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
20fe0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
20ff0 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54   (pPager?PGHDR_T
21000 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
21010 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger):0);.}../*.*
21020 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
21030 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
21040 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
21050 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
21060 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
21070 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
21080 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
21090 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
210a0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
210b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
210c0 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
210d0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
210e0 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
210f0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
21100 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
21110 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
21120 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
21130 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
21140 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
21150 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
21160 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
21170 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
21180 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
21190 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
211a0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
211b0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
211c0 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
211d0 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
211e0 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
211f0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
21200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
21210 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
21220 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
21230 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
21240 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
21250 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
21260 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
21270 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
21280 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
21290 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
212a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
212b0 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
212c0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
212d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
212e0 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
212f0 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
21300 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
21310 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
21320 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
21330 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21340 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  rLockstate(Pager
21350 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21360 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
21370 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66  kState(pPager->f
21380 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  d);.}.#endif..#i
21390 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
213a0 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
213b0 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
213c0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
213d0 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
213e0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
213f0 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70  ite3PagerRefdump
21400 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21410 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
21420 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21430 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
21440 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
21450 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
21460 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
21470 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
21480 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
21490 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
214a0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
214b0 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
214c0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
214d0 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
214e0 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
214f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
21500 4b 49 4f 20 2a 2f 0a                             KIO */.