/ Hex Artifact Content
Login

Artifact 5846d0c1b010145b656719c7579018f906f2663f:


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: 35 20 32 30 30 37 2f 30 33 2f 32 36 20 30 38 3a  5 2007/03/26 08:
0360: 30 35 3a 31 32 20 64 61 6e 69 65 6c 6b 31 39 37  05:12 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 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
8370: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
8380: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8390: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
83a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
83b0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
83c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
83d0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
83e0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
83f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8400: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8410: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
8420: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8430: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  eMode ){.      s
8440: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8450: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
8460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8470: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
8480: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
8490: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
84a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
84b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
84c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
84d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
84e0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
84f0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
8500: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8510: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
8520: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
8530: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
8540: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
8550: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
8560: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
8570: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8580: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
8590: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
85a0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
85b0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
85c0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
85d0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
85e0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
85f0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
8600: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77  ;.      pPg->alw
8610: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
8630: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
8640: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
8650: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8660: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
8670: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
8680: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
8690: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
86a0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
86b0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
86c0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
86d0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
86e0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
86f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
8700: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
8710: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
8720: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  al==0 );.  }.  i
8730: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
8740: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
8760: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
8770: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
8780: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8790: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
87a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
87b0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
87c0: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
87d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
87e0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
87f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
8800: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
8810: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
8820: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
8830: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
8840: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
8850: 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
8860: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67  ->pFirst;.  pPag
8870: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
8880: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8890: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
88a0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
88b0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
88c0: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
88d0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
88e0: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
88f0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8900: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8910: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8920: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8930: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8940: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8950: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8960: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8970: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8980: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8990: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
89a0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
89b0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
89c0: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
89d0: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
89e0: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
89f0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8a00: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8a10: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8a20: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8a30: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8a40: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8a50: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
8a60: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
8a70: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
8a80: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
8a90: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
8aa0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8ab0: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8ac0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8ad0: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8ae0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8af0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8b00: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8b10: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8b20: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8b30: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8b40: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
8b50: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
8b60: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
8b70: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
8b80: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
8b90: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
8ba0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8bb0: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8bc0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8bd0: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8be0: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8bf0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8c00: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8c10: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8c20: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8c30: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8c40: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
8c50: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
8c60: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
8c70: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8c80: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
8c90: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
8ca0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8cb0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8cc0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8cd0: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8ce0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8cf0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8d00: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8d10: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8d20: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8d30: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8d40: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
8d50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
8d60: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
8d70: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
8d80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
8d90: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
8da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
8db0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
8dc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8dd0: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
8de0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
8df0: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
8e00: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
8e10: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
8e20: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
8e30: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
8e40: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
8e50: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
8e60: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
8e70: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
8e80: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
8e90: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
8ea0: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
8eb0: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
8ec0: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
8ed0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
8ee0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
8ef0: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
8f00: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
8f10: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
8f20: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
8f50: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
8f60: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8f90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
8fa0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
8fb0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fd0: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
8fe0: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
8ff0: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
9000: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
9010: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
9020: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
9030: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
9040: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
9050: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
9060: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9070: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
9080: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9090: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
90a0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
90b0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
90c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
90d0: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
90e0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
90f0: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
9100: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
9110: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
9120: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
9130: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9140: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
9150: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9160: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
9170: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9180: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9190: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
91a0: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
91b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
91c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
91d0: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
91e0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
91f0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
9200: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
9210: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
9220: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
9230: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
9240: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
9250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9260: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9270: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9280: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9290: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
92a0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
92b0: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
92c0: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
92d0: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
92e0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
92f0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
9300: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
9310: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
9320: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9330: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
9340: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9350: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9360: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9370: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9390: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
93a0: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
93b0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
93c0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
93d0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
93e0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
93f0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
9400: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
9410: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
9420: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
9430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9440: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
9450: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9460: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
9470: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
9480: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9490: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
94a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
94b0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
94c0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
94d0: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
94e0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
94f0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9500: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
9510: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
9520: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
9530: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
9540: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
9550: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
9560: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
9570: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
9580: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
9590: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
95a0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
95b0: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
95c0: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
95d0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
95e0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
95f0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
9600: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
9610: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
9620: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
9630: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
9640: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
9650: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
9660: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
9670: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
9680: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
9690: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
96a0: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
96b0: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
96c0: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
96d0: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
96e0: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
96f0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
9700: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
9710: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
9720: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
9730: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
9740: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
9750: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
9760: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
9770: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
9780: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
9790: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
97a0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
97b0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
97c0: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
97d0: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
97e0: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
97f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
9800: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
9810: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
9820: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
9830: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
9840: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
9850: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
9860: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
9870: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
9880: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
9890: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
98a0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
98b0: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
98c0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
98d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
98e0: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
98f0: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9900: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9910: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9920: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9930: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
9940: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
9950: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
9960: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9970: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9980: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9990: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
99a0: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
99b0: 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33  g!=0 );.  TRACE3
99c0: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
99d0: 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
99e0: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
99f0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9a00: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9a10: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
9a20: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
9a30: 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  nc==0) ){.    rc
9a40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
9a50: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
9a60: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
9a70: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9a80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9a90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9aa0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9ab0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
9ac0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9ad0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
9ae0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
9af0: 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
9b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9b10: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
9b20: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
9b30: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
9b40: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
9b50: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
9b60: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
9b70: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
9b80: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
9b90: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
9ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
9bb0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
9bc0: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
9bd0: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
9be0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
9bf0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
9c00: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
9c10: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
9c20: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
9c30: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
9c40: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
9c50: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9c60: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9c70: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9c80: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
9c90: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
9ca0: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
9cb0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
9cc0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
9cd0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9ce0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9cf0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
9d00: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
9d10: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9d20: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9d30: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9d40: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9d50: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
9d60: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69  eSize);.    }.#i
9d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9d80: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
9d90: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
9da0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
9db0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45  .#endif.    CODE
9dc0: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
9dd0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
9de0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
9df0: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
9e00: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
9e10: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43 68  lue of Pager.iCh
9e20: 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20 20  angeCount */.   
9e30: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
9e40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43        pPager->iC
9e50: 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74  hangeCount = ret
9e60: 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 2c  rieve32bits(pPg,
9e70: 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   24);.    }.  }.
9e80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9e90: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
9ea0: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
9eb0: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
9ec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
9ed0: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
9ee0: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
9ef0: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
9f00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9f10: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
9f20: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
9f30: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
9f40: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
9f50: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
9f60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9f70: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
9f80: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
9f90: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
9fa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
9fb0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
9fc0: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
9fd0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
9fe0: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
9ff0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a000: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
a010: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
a020: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
a030: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
a040: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
a050: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
a060: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
a070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
a080: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
a090: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a0a0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
a0b0: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
a0c0: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
a0d0: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
a0e0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
a0f0: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  er_open = 0;.  O
a100: 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20  sFile *master = 
a110: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  0;.  char *zMast
a120: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
a130: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
a140: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a150: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
a160: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
a170: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
a180: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a190: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
a1a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a1b0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
a1c0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
a1d0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
a1e0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
a1f0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
a200: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
a210: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
a220: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  rence..  */.  rc
a230: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a240: 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72  ReadOnly(zMaster
a250: 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66  , &master);.  if
a260: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a270: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a280: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
a290: 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  pen = 1;.  rc = 
a2a0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
a2b0: 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  e(master, &nMast
a2c0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
a2d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a2e0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a2f0: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
a300: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
a310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
a320: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
a330: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
a340: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
a350: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
a360: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
a370: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
a380: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
a390: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
a3a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
a3b0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
a3c0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
a3d0: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
a3e0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
a3f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
a400: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
a410: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
a420: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a430: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
a440: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
a450: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a460: 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72  te3OsRead(master
a470: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
a480: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
a490: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
a4a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
a4b0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
a4c0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
a4d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
a4e0: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
a4f0: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
a500: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
a510: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
a520: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
a530: 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  sts(zJournal) ){
a540: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
a550: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
a560: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
a570: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a580: 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
a590: 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
a5a0: 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
a5b0: 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
a5c0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
a5d0: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
a5e0: 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
a5f0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
a600: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
a610: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a620: 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20  OsFile *journal 
a630: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
a640: 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20   c;..        rc 
a650: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a660: 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c  eadOnly(zJournal
a670: 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  , &journal);.   
a680: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a690: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a6a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
a6b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
a6c0: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
a6d0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
a6e0: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
a6f0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
a700: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
a710: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a720: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a730: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a740: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a750: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a760: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
a770: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
a780: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
a790: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
a7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a7b0: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
a7c0: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
a7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
a7e0: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
a7f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
a800: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a810: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
a820: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a830: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
a850: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
a860: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
a870: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
a880: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d  lite3OsDelete(zM
a890: 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74  aster);..delmast
a8a0: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
a8b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a8c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a8d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a8e0: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
a8f0: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
a900: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
a910: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
a920: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
a930: 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  0./*.** Make eve
a940: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
a950: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
a960: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
a970: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
a980: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
a990: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
a9a0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
a9b0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
a9c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a9d0: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
a9e0: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
a9f0: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
aa00: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
aa10: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
aa20: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
aa30: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
aa40: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
aa50: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
aa60: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
aa70: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
aa80: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
aa90: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
aaa0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
aab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
aac0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
aad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
aae0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
aaf0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ab00: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
ab10: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
ab20: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
ab30: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  All){.    char *
ab40: 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e 70  zBuf = pPager->p
ab50: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
ab60: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
ab70: 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f   for one page */
ab80: 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64  .    if( !pPg->d
ab90: 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irty ) continue;
aba0: 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50  .    if( (int)pP
abb0: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
abc0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
abd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
abe0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
abf0: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
ac00: 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67  geSize*(i64)(pPg
ac10: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
ac20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ac30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
ac40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
ac50: 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  d(pPager->fd, zB
ac60: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
ac70: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
ac80: 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45 46       TRACE3("REF
ac90: 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
aca0: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
acb0: 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
acc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
acd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44  break;.      COD
ace0: 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66  EC1(pPager, zBuf
acf0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
ad00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ad10: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
ad20: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ad30: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
ad40: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
ad50: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
ad60: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
ad70: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
ad80: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d  Size) ){.      m
ad90: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
ada0: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
adb0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
adc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
add0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
ade0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
adf0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
ae00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ae10: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
ae20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
ae30: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
ae40: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
ae50: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
ae60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ae70: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
ae80: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
ae90: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
aea0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
aeb0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
aec0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
aed0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
aee0: 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dif.  }.  pPager
aef0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
af00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
af10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
af20: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
af30: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
af40: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
af50: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
af60: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
af70: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
af80: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
af90: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
afa0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
afb0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
afc0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
afd0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
afe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
aff0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
b000: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
b010: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
b020: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b030: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b050: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b060: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b070: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b080: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b090: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b0a0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b0b0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b0c0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b0d0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b0e0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b0f0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b100: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b110: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b120: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b130: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b140: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b150: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b160: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b170: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b180: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b190: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b1a0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b1b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b1c0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b1d0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b1e0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b1f0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b200: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b210: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b220: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b230: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b240: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b250: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b260: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b270: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b280: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b290: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b2a0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b2b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b2c0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b2d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b2e0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b2f0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b300: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b310: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b320: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b330: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b340: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b350: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b360: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b370: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b380: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b390: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b3a0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b3b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b3c0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b3d0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b3e0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b3f0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b400: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b410: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b420: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b430: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b440: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b450: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b460: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b470: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b480: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b490: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b4a0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b4b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b4c0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b4d0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b4e0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b4f0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b500: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b510: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b520: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b530: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b540: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b550: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b560: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b570: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b580: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b590: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b5a0: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b5b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b5c0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b5d0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b5e0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b5f0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b600: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b610: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b620: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b630: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b640: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b650: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b660: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b670: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b680: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b690: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b6a0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b6b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b6c0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b6d0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b6e0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b6f0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b700: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b710: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b720: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b730: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b740: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b750: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
b760: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
b770: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
b780: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
b790: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b7a0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
b7b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
b7c0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b7d0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
b7e0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
b7f0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
b800: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b810: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
b820: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
b830: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
b840: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
b850: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
b860: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
b870: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
b880: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
b890: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
b8a0: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
b8b0: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
b8c0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
b8d0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
b8e0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
b8f0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
b900: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
b910: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
b920: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
b930: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
b940: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
b950: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
b960: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
b970: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
b980: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
b990: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
b9a0: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
b9b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
b9c0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
b9d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
b9e0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
b9f0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ba00: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
ba10: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
ba20: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
ba30: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
ba40: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
ba50: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
ba60: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
ba70: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
ba80: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
ba90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
baa0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bab0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bac0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bad0: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bae0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bb10: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bb20: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bb50: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
bb60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bb90: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
bba0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
bbb0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
bbc0: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
bbd0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
bbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bbf0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc00: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
bc10: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
bc20: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
bc30: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
bc40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
bc50: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
bc60: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bc70: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
bc80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
bc90: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
bca0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
bcb0: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bcc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcd0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bcf0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bd00: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bd10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bd20: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bd30: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bd40: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bd50: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
bd60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
bd70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
bd80: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
bd90: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
bda0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
bdb0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
bdc0: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
bdd0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
bde0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
bdf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
be00: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
be10: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
be20: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
be30: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
be40: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
be50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
be60: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
be70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
be80: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
be90: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
bea0: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
beb0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
bec0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
bed0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
bee0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
bef0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
bf00: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
bf10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bf20: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bf30: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
bf40: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
bf50: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
bf60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bf70: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
bf80: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
bf90: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
bfa0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
bfb0: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
bfc0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
bfd0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
bfe0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
bff0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c000: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c010: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c030: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c040: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c050: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c060: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c070: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c080: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c090: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c0a0: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c0b0: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c0c0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c0d0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c0e0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c0f0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c100: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c110: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c120: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c130: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c140: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c150: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c160: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c170: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c180: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c190: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c1a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c1b0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c1c0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c1d0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c1e0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c1f0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c200: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c210: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c220: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c230: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c240: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c250: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c260: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c270: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c280: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c290: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c2a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c2b0: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c2c0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c2d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c2e0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c2f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c300: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c310: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c320: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c330: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c340: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c350: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c360: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c370: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c380: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c390: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c3a0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c3b0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c3c0: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c3d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c3e0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c3f0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c400: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c410: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c420: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c430: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c440: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c450: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c460: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c470: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c480: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c490: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c4a0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c4b0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c4c0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c4d0: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c4e0: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c4f0: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c500: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c510: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c520: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c530: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c540: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c550: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
c560: 53 49 56 45 20 26 26 20 0a 20 20 20 20 20 20 20  SIVE && .       
c570: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c580: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
c590: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
c5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
c5b0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
c5c0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72  =0 || pPager->or
c5d0: 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29  igDbSize==mxPg )
c5e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
c5f0: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
c600: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
c610: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c620: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
c630: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c650: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c660: 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
c670: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
c680: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
c690: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
c6a0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
c6b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
c6c0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
c6d0: 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
c6e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c6f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c700: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
c710: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
c720: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c730: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
c740: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
c750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
c760: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c770: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c780: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
c790: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
c7a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
c7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
c7c0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c7d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c7e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
c7f0: 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
c800: 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
c810: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
c820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c830: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c840: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
c850: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
c860: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
c870: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
c880: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
c890: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
c8a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
c8b0: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
c8c0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
c8d0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
c8e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
c8f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c900: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c910: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
c920: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
c930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c940: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
c960: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
c970: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
c980: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
c990: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
c9a0: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
c9b0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
c9c0: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c9d0: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c9e0: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c9f0: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
ca00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
ca10: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
ca20: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
ca30: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
ca40: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
ca50: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
ca60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ca70: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
ca80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
ca90: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
caa0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
cab0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
cac0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cad0: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
cae0: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
caf0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
cb00: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
cb10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
cb20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
cb30: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
cb40: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
cb50: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
cb60: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
cb70: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
cb80: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
cb90: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
cba0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
cbb0: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
cbc0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
cbd0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
cbe0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
cbf0: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
cc00: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
cc10: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
cc20: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
cc30: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
cc40: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
cc50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cc60: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
cc70: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
cc80: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cca0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
ccb0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
ccc0: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
ccd0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
cce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ccf0: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
cd00: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
cd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
cd30: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
cd40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cd50: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
cd60: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
cd70: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
cd80: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
cd90: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
cda0: 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
cdb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cdc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cdd0: 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
cde0: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
cdf0: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
ce00: 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
ce10: 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74  set just after t
ce20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
ce30: 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
ce40: 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66  page written bef
ce50: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ore the first jo
ce60: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72  urnal-header for
ce70: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
ce80: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ce90: 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72   was written, or
cea0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ceb0: 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
cec0: 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
ced0: 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
cee0: 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
cef0: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
cf00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cf10: 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
cf20: 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
cf30: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
cf40: 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
cf50: 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
cf60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
cf70: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
cf80: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
cf90: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
cfa0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
cfb0: 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  VE ){.    rc = p
cfc0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
cfd0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
cfe0: 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61  mtSize);.  }.  a
cff0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
d000: 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
d010: 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ED );.  pPager->
d020: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
d030: 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >stmtSize;..  /*
d040: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
d050: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
d060: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
d070: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
d080: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d090: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
d0a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
d0b0: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  en );.  sqlite3O
d0c0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
d0d0: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
d0e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
d0f0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
d100: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
d110: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
d120: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
d130: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
d140: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
d150: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
d160: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d170: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
d180: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
d190: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
d1a0: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
d1b0: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
d1c0: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
d1d0: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
d1e0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
d1f0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
d200: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
d210: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
d220: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
d230: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
d240: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d250: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d270: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
d280: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d290: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
d2a0: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
d2b0: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
d2c0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
d2d0: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
d2e0: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
d2f0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d300: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
d310: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
d320: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
d330: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
d340: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
d350: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
d360: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
d370: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
d380: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
d390: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
d3a0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
d3b0: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
d3c0: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
d3d0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
d3e0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
d3f0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
d400: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
d410: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
d420: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
d430: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d440: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
d450: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
d460: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
d470: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d480: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
d490: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d4a0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
d4b0: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
d4c0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
d4d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d4e0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
d4f0: 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
d500: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d510: 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
d520: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d530: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d540: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
d550: 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  fd, 1);.    asse
d560: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
d570: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
d580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d590: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d5a0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
d5b0: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
d5c0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
d5d0: 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
d5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d5f0: 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
d600: 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
d610: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
d620: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
d630: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
d640: 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
d650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d660: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
d670: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
d680: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
d690: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d6a0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
d6b0: 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
d6c0: 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
d6d0: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
d6e0: 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
d6f0: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
d700: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
d710: 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
d720: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d730: 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
d740: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
d750: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d760: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d770: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d780: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d790: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d7a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d7b0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
d7c0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d7d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
d7e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d7f0: 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74  = szJ;.  .end_st
d800: 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  mt_playback:.  i
d810: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d820: 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ) {.    pPager->
d830: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d840: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
d850: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
d860: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
d870: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d880: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
d890: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
d8a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
d8b0: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
d8c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d8d0: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
d8e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
d8f0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
d900: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
d910: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
d920: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
d930: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
d940: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
d950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
d960: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
d970: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
d980: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
d990: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
d9a0: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
d9b0: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
d9c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
d9d0: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
d9e0: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
d9f0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
da00: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
da10: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
da20: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
da30: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
da40: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
da50: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
da60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
da70: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
da80: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
da90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
daa0: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
dab0: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
dac0: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
dad0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
dae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
daf0: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
db00: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
db10: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
db20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
db30: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
db40: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
db50: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
db60: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
db70: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
db80: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
db90: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
dba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
dbc0: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
dbd0: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
dbe0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
dbf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dc00: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
dc10: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
dc20: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
dc30: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
dc40: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
dc50: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
dc60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
dc70: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
dc80: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
dc90: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
dca0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
dcb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
dcc0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
dcd0: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
dce0: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
dcf0: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
dd00: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
dd10: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
dd20: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
dd40: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
dd50: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
dd60: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
dd70: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
dd80: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
dd90: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
dda0: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
ddb0: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
ddc0: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
ddd0: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
dde0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
ddf0: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
de00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
de10: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
de20: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
de30: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
de40: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
de50: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
de60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
de70: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
de80: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
de90: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
dea0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
deb0: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
dec0: 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61  ll_fsync){.  pPa
ded0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
dee0: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
def0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
df00: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
df10: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
df20: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
df30: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  .  pPager->full_
df40: 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79  fsync = full_fsy
df50: 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  nc;.  if( pPager
df60: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
df70: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
df80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
df90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
dfa0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
dfb0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
dfc0: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
dfd0: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
dfe0: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
dff0: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
e000: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
e010: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
e020: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e030: 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
e040: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
e050: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
e060: 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
e070: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
e080: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
e090: 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
e0a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e0b0: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
e0c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e0d0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
e0e0: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
e0f0: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
e100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77  ..**.** The OS w
e110: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
e120: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
e130: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
e140: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64   it is.** closed
e150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e160: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e170: 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46  temp(OsFile **pF
e180: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
e190: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  8;.  int rc;.  c
e1a0: 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45  har zFile[SQLITE
e1b0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
e1c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e1d0: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
e1e0: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
e1f0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
e200: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e210: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
e220: 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  f.  do{.    cnt-
e230: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
e240: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
e250: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
e260: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
e270: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
e280: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
e290: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
e2a0: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
e2b0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
e2c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e2d0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e2e0: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
e2f0: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
e300: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
e310: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
e320: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
e330: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
e340: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
e350: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
e360: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
e370: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
e380: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
e390: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
e3a0: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
e3b0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
e3c0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
e3d0: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
e3e0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
e3f0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
e400: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
e410: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
e420: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
e430: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
e440: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
e450: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
e460: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
e470: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
e480: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e490: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
e4a0: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
e4b0: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
e4c0: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
e4d0: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
e4e0: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
e4f0: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
e500: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
e510: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
e520: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
e530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
e540: 72 4f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  rOpen(.  Pager *
e550: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
e560: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
e570: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
e580: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
e590: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
e5a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
e5b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e5c0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
e5d0: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
e5e0: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
e5f0: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
e600: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
e610: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
e620: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
e630: 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
e640: 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
e650: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
e660: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  Pager = 0;.  cha
e670: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
e680: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
e690: 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  Len;  /* Compile
e6a0: 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73  r is wrong. This
e6b0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
e6c0: 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73  alized before us
e6d0: 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66  e */.  OsFile *f
e6e0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
e6f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
e700: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
e710: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
e720: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
e730: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
e740: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
e750: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
e760: 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
e770: 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
e780: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e790: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
e7a0: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
e7b0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e7c0: 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  IZE];.#ifdef SQL
e7d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
e7e0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
e7f0: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
e800: 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
e810: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
e820: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
e830: 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
e840: 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
e850: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
e860: 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
e870: 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
e880: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
e890: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
e8a0: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
e8b0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
e8c0: 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
e8d0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
e8e0: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
e8f0: 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f  an be set. It wo
e900: 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61  uld be nice to a
e910: 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20  ssert.  ** that 
e920: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
e930: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62  c is non-zero, b
e940: 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65  ut alas this bre
e950: 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a  aks test cases .
e960: 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
e970: 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72  invoke the pager
e980: 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a   directly..  */.
e990: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
e9a0: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
e9b0: 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
e9c0: 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64  rt( pTsd );.#end
e9d0: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c  if..  /* If mall
e9e0: 6f 63 28 29 20 68 61 73 20 61 6c 72 65 61 64 79  oc() has already
e9f0: 20 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20 53   failed return S
ea00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66  QLITE_NOMEM. Bef
ea10: 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65  ore even.  ** te
ea20: 73 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c 20  sting for this, 
ea30: 73 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f 20  set *ppPager to 
ea40: 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c  NULL so the call
ea50: 65 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61 67  er knows the pag
ea60: 65 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  er.  ** structur
ea70: 65 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f  e was never allo
ea80: 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a  cated. .  */.  *
ea90: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
eaa0: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
eab0: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
eac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ead0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
eae0: 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&fd, 0, sizeof
eaf0: 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  (fd));..  /* Ope
eb00: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
eb10: 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61   and set zFullPa
eb20: 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20  thname to point 
eb30: 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20  at malloc()ed . 
eb40: 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61   ** memory conta
eb50: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65  ining the comple
eb60: 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65  te filename (i.e
eb70: 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  . including the 
eb80: 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f  directory)..  */
eb90: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
eba0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
ebb0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
ebc0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
ebd0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
ebe0: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
ebf0: 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
ec00: 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
ec10: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
ec20: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
ec30: 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  "");.    }else.#
ec40: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
ec50: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
ec60: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
ec70: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
ec80: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  e);.      if( zF
ec90: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
eca0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ecb0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
ecc0: 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  te(zFullPathname
ecd0: 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79  , &fd, &readOnly
ece0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ecf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
ed00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
ed10: 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20  pentemp(&fd);.  
ed20: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ed30: 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a  ileName(zTemp);.
ed40: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
ed50: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
ed60: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
ed70: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
ed80: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
ed90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eda0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
edb0: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
edc0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
edd0: 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  te the Pager str
ede0: 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20  ucture. As part 
edf0: 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f  of the same allo
ee00: 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65  cation, allocate
ee10: 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  .  ** space for 
ee20: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f  the full paths o
ee30: 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65  f the file, dire
ee40: 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61  ctory and journa
ee50: 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a  l .  ** (Pager.z
ee60: 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e  Filename, Pager.
ee70: 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50  zDirectory and P
ee80: 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a  ager.zJournal)..
ee90: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
eea0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
eeb0: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
eec0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
eed0: 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
eee0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
eef0: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
ef00: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
ef10: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26      if( pPager &
ef20: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
ef30: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ef40: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68  >pTmpSpace = (ch
ef50: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
ef60: 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41  cRaw(SQLITE_DEFA
ef70: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
ef80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
ef90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
efa0: 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  ured in either o
efb0: 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
efc0: 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d  ve, free the mem
efd0: 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ory .  ** pointe
efe0: 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74  d to by zFullPat
eff0: 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20  hname, free the 
f000: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
f010: 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20  and close the . 
f020: 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20   ** file. Since 
f030: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
f040: 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
f050: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
f060: 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
f070: 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
f080: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
f090: 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75   !pPager || !zFu
f0a0: 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70  llPathname || !p
f0b0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
f0c0: 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
f0d0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
f0e0: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
f0f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
f100: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f110: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
f120: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
f130: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
f140: 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
f150: 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33  );.  }..  TRACE3
f160: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
f170: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
f180: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
f190: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
f1a0: 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
f1b0: 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
f1c0: 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
f1d0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
f1e0: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
f1f0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f200: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
f210: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
f220: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
f230: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
f240: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
f250: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
f260: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
f270: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
f280: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
f290: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f2a0: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
f2b0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65  );..  for(i=name
f2c0: 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67  Len; i>0 && pPag
f2d0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
f2e0: 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
f2f0: 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
f300: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f310: 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63  i-1] = 0;.  strc
f320: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
f330: 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  nal, zFullPathna
f340: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
f350: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f360: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
f370: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
f380: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
f390: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
f3a0: 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67   = fd;.  /* pPag
f3b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f3c0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f3d0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
f3e0: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
f3f0: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
f400: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
f410: 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
f420: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
f430: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
f440: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
f450: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
f460: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
f470: 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
f480: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
f490: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
f4a0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
f4b0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
f4c0: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
f4d0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
f4e0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f4f0: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
f500: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f510: 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
f520: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  /* pPager->nMaxP
f530: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
f540: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
f550: 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  00;.  assert( PA
f560: 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  GER_UNLOCK==0 );
f570: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f580: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
f590: 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
f5a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
f5b0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
f5c0: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
f5d0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
f5e0: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
f5f0: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
f600: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f610: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f620: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f630: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
f640: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
f650: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
f660: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
f670: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
f680: 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61  c?0:1);.  /* pPa
f690: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
f6a0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f6b0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
f6c0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f6d0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
f6e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
f6f0: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
f700: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61  ENT(nExtra);.  a
f710: 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29  ssert(fd||memDb)
f720: 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
f730: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
f740: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f750: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
f760: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  d);.  }.  /* pPa
f770: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
f780: 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
f790: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
f7a0: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
f7b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
f7c0: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
f7d0: 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
f7e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
f7f0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
f800: 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
f810: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20   pTsd->pPager;. 
f820: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
f830: 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
f840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f850: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f860: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
f870: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
f880: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
f890: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
f8a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
f8b0: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
f8c0: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
f8d0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
f8e0: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
f8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f900: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
f910: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
f920: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
f930: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
f940: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
f950: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
f960: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
f970: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
f980: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
f990: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
f9a0: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
f9b0: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
f9c0: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
f9d0: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
f9e0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
f9f0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
fa00: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
fa10: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
fa20: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
fa30: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
fa40: 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
fa50: 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
fa60: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
fa70: 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
fa80: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
fa90: 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
faa0: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
fab0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
fac0: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
fad0: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
fae0: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
faf0: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
fb00: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
fb10: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
fb20: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
fb30: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
fb40: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
fb50: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
fb60: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
fb70: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
fb80: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
fb90: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
fba0: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
fbb0: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
fbc0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
fbd0: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
fbe0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
fbf0: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
fc00: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
fc10: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
fc20: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
fc30: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
fc40: 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
fc50: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
fc60: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
fc70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fc80: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52  he page size.  R
fc90: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69  eturn the new si
fca0: 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67  ze.  If the sugg
fcb0: 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20  est new page.** 
fcc0: 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70  size is inapprop
fcd0: 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
fce0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
fcf0: 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64  size is selected
fd00: 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64  .** and returned
fd10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd20: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fd30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fd40: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
fd50: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
fd60: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
fd70: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
fd80: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
fd90: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
fda0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
fdb0: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
fdc0: 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
fdd0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76  ReallocOrFree((v
fde0: 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
fdf0: 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53  pTmpSpace, pageS
fe00: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ize);.  }.  retu
fe10: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
fe20: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
fe30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
fe40: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
fe50: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
fe60: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
fe70: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
fe80: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
fe90: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
fea0: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
feb0: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
fec0: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
fed0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
fee0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
fef0: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
ff00: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
ff10: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
ff20: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
ff30: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
ff40: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
ff50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
ff60: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
ff70: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
ff80: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
ff90: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
ffa0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
ffb0: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
ffc0: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
ffd0: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
ffe0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
fff0: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
10000 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10010 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
10020 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
10030 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10040 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
10050 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10060 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
10070 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
10080 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
10090 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
100a0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
100b0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
100c0 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
100d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
100e0 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
100f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
10100 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
10110 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
10120 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10130 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10140 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
10150 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
10160 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
10170 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
10180 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
10190 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
101a0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
101b0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
101c0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
101d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
101e0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
101f0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
10200 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
10210 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
10220 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
10230 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
10240 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
10250 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
10260 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
10270 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
10280 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
10290 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
102a0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
102b0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
102c0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
102d0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
102e0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
102f0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
10300 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
10310 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
10320 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
10330 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
10340 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
10350 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
10360 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
10380 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
10390 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
103a0 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
103b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
103c0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
103d0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
103e0 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
103f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10400 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
10410 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
10420 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
10430 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
10440 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
10450 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
10460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
10480 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
10490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
104a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
104b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
104c0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
104d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
104e0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
104f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10500 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
10510 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
10520 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
10530 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
10540 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
10550 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
10560 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
10570 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
10580 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
10590 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
105a0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
105b0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
105c0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
105d0 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
105e0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
105f0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
10600 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
10610 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
10620 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10630 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
10640 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
10650 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
10660 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
10670 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
10680 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
10690 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
106a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
106b0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
106c0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
106d0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
106e0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
106f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10700 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
10710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10720 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
10730 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
10740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10750 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
10760 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
10770 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
10780 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10790 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
107a0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
107b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
107c0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
107d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
107e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
107f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10800 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
10810 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
10820 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
10830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
10840 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
10850 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10860 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
10870 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
10880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10890 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
108a0 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
108b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
108c0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
108d0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
108e0 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
108f0 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
10900 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
10910 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10920 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
10930 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
10940 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
10950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10960 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
10970 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
10980 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
10990 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
109a0 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
109b0 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
109c0 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
109d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
109e0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
109f0 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
10a00 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
10a10 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
10a20 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75  erMovepage() rou
10a30 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61  tine can leave a
10a40 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
10a50 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76   pNextFree/pPrev
10a60 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69  Free list that i
10a70 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  s not a part of 
10a80 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a  any hash-chain..
10a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10aa0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50  nlinkHashChain(P
10ab0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10ac0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
10ad0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
10ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
10af0 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
10b00 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
10b10 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
10b20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
10b30 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
10b40 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
10b50 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
10b60 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
10b70 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
10b80 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
10b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
10ba0 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26  Hash[pPg->pgno &
10bb0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
10bc0 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  1)]!=pPg );.    
10bd0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
10be0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
10bf0 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
10c00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
10c10 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50   pPg->pgno & (pP
10c20 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
10c30 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
10c40 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
10c50 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  tHash;.  }.  if(
10c60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c   MEMDB ){.    cl
10c70 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
10c80 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
10c90 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50  ager));.  }.  pP
10ca0 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
10cb0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
10cc0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
10cd0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
10ce0 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
10cf0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
10d00 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
10d10 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
10d20 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
10d30 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
10d40 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
10d50 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
10d60 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
10d70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
10d80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
10d90 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70  .  /* Keep the p
10da0 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e  FirstSynced poin
10db0 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ter pointing at 
10dc0 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72  the first synchr
10dd0 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20  onized page */. 
10de0 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
10df0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
10e00 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
10e10 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10e20 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
10e30 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
10e40 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
10e50 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ; }.    pPager->
10e60 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
10e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
10e80 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  nk from the free
10e90 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50  list */.  if( pP
10ea0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
10eb0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
10ec0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
10ed0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
10ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
10ef0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
10f00 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
10f10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
10f20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10f30 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
10f40 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
10f50 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
10f60 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
10f70 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
10f80 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
10f90 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
10fa0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
10fb0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
10fc0 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a  >pPrevFree;.  }.
10fd0 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10fe0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10ff0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  e = 0;..  /* Unl
11000 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
11010 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
11020 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
11030 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
11040 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11050 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
11060 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11070 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
11080 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  uncate an in-mem
11090 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44  ory database.  D
110a0 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67  elete.** all pag
110b0 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
110c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
110d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
110e0 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
110f0 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
11100 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
11110 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11120 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73  are zeroed..*/.s
11130 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72  tatic void memor
11140 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  yTruncate(Pager 
11150 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
11160 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
11170 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
11180 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
11190 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
111a0 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
111b0 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
111c0 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
111d0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
111e0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
111f0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11200 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11210 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
11220 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
11230 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
11240 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
11250 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11260 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
11270 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
11280 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
11290 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
112a0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
112b0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
112c0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
112d0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
112e0 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
112f0 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
11300 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
11310 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63  fine memoryTrunc
11320 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f  ate(p).#endif../
11330 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
11340 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
11350 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
11360 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
11370 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
11380 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
11390 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
113a0 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
113b0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
113c0 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
113d0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
113e0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
113f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
11400 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
11410 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
11420 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
11430 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
11440 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
11450 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
11460 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
11470 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
11480 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
11490 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
114a0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
114b0 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
114c0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
114d0 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
114e0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
114f0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
11500 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
11510 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
11520 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
11530 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
11540 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
11550 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
11560 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
11570 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
11580 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
11590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
115a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
115b0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
115c0 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20  er->dbSize<0 || 
115d0 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
115e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
115f0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
11600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
11620 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11630 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
11640 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
11650 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
11660 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
11670 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
11680 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
11690 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
116a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
116b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
116c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
116d0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20   locktype;.     
116e0 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
116f0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
11700 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
11710 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
11730 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
11740 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
11750 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
11760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11770 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
11780 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11790 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
117a0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
117b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
117c0 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44  R_SHARED || MEMD
117d0 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  B );.  sqlite3Pa
117e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
117f0 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
11800 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
11810 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
11820 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
11830 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
11840 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
11850 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
11860 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11880 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
11890 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
118a0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
118b0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
118c0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
118d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
118e0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
118f0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
11900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
11930 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11940 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
11950 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
11960 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
11970 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
11980 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
11990 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
119a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
119b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
119c0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
119d0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
119e0 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
119f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11a00 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11a10 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
11a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11a30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
11a40 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
11a50 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
11a60 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
11a70 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
11a80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
11a90 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
11aa0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
11ab0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
11ac0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
11ad0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
11ae0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
11af0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
11b00 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
11b10 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
11b20 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
11b30 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
11b40 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
11b50 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
11b60 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
11b70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
11b80 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
11b90 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
11ba0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
11bb0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
11bc0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
11bd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
11be0 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
11bf0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
11c00 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
11c10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
11c20 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
11c30 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
11c40 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
11c50 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
11c60 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
11c70 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
11c80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
11c90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11ca0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
11cb0 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ger){.#ifdef SQL
11cc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
11cd0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
11ce0 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
11cf0 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
11d00 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
11d10 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
11d20 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
11d30 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
11d40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
11d50 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
11d60 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
11d70 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
11d80 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
11d90 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
11da0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
11db0 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
11dc0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
11dd0 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
11de0 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  an be set..  */.
11df0 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
11e00 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
11e10 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
11e20 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20  rt( pPager );.  
11e30 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20  assert( pTsd && 
11e40 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  pTsd->nAlloc );.
11e50 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c  #endif..  disabl
11e60 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11e70 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65  rrors();.  pPage
11e80 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
11e90 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
11ea0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
11eb0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
11ec0 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  r);.  pagerUnloc
11ed0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
11ee0 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  ger);.  enable_s
11ef0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11f00 72 73 28 29 3b 0a 20 20 54 52 41 43 45 32 28 22  rs();.  TRACE2("
11f10 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
11f20 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
11f30 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
11f40 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
11f50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11f60 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
11f70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11f80 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  en==0 && pPager-
11f90 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b  >stmtOpen==0) );
11fa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
11fb0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
11fc0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11fd0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
11fe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
11ff0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
12000 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
12010 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
12020 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12030 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
12040 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12050 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
12060 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
12070 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
12080 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12090 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
120a0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
120b0 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
120c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
120d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
120e0 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23  ;.  ** }.  */..#
120f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12100 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
12110 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
12120 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d  e the pager from
12130 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
12140 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74   of pagers start
12150 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72  ing at .  ** Thr
12160 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69  eadData.pPager i
12170 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
12180 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ent is enabled..
12190 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
121a0 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20  r==pTsd->pPager 
121b0 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61  ){.    pTsd->pPa
121c0 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ger = pPager->pN
121d0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
121e0 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20    Pager *pTmp;. 
121f0 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54     for(pTmp = pT
12200 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70  sd->pPager; pTmp
12210 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b  ->pNext!=pPager;
12220 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
12230 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70  t){}.    pTmp->p
12240 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
12250 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
12260 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12270 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
12280 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12290 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
122a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
122b0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
122c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
122d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
122e0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
122f0 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
12300 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
12310 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
12320 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72  (DbPage *p){.  r
12330 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
12340 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
12350 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
12360 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
12370 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
12380 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
12390 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
123a0 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
123b0 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
123c0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
123d0 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
123e0 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
123f0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
12400 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
12410 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
12420 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
12430 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
12440 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
12450 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
12460 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
12470 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
12480 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
12490 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
124a0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
124b0 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
124c0 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
124d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
124e0 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
124f0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
12500 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
12510 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
12520 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
12530 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
12540 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
12550 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
12560 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
12570 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
12580 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12590 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
125a0 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
125b0 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
125c0 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
125d0 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
125e0 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
125f0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
12600 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
12610 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
12620 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
12630 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
12640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12650 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12660 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
12670 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
12680 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
12690 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
126a0 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
126b0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
126c0 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
126d0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
126e0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
126f0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
12700 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
12710 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
12720 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
12730 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
12740 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12750 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
12760 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
12770 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
12780 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
12790 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
127a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
127b0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
127c0 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
127d0 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
127e0 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
127f0 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
12800 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
12810 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
12820 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
12830 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
12840 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
12850 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
12860 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
12870 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
12880 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
12890 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
128a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
128b0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
128c0 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  {.  page_ref(pPg
128d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
128e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
128f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
12900 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12910 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
12920 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
12930 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
12940 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
12950 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
12960 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
12970 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
12980 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
12990 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
129a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
129b0 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
129c0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
129d0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
129e0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
129f0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12a00 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
12a10 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
12a20 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
12a30 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12a40 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
12a50 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
12a60 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
12a70 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
12a80 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
12a90 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
12aa0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
12ab0 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
12ac0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
12ad0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
12ae0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12af0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
12b00 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
12b10 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
12b20 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
12b30 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
12b40 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
12b50 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
12b60 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12b70 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
12b80 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
12b90 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
12ba0 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
12bb0 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
12bc0 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
12bd0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
12be0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
12bf0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
12c00 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
12c10 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
12c20 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
12c30 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
12c40 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
12c50 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
12c60 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
12c70 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
12c80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12c90 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
12ca0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
12cb0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
12cc0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
12cd0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
12ce0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12cf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12d00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
12d10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12d20 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
12d30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
12d40 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
12d50 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
12d60 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
12d70 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
12d80 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
12d90 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
12da0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12db0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
12dc0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
12dd0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
12de0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12df0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
12e00 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
12e10 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
12e20 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
12e30 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
12e40 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
12e50 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
12e60 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
12e70 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
12e80 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
12e90 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12ea0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
12eb0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12ec0 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
12ed0 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
12ee0 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
12ef0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
12f00 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
12f10 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12f30 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
12f40 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
12f50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12f60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
12f70 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
12f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12f90 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12fa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12fb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12fc0 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
12fd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
12fe0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
12ff0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
13000 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
13010 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
13020 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
13030 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
13040 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
13050 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
13060 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
13070 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
13080 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
13090 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
130a0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
130b0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
130c0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
130d0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
130e0 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
130f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
13100 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
13110 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
13120 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
13130 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
13140 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
13150 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
13160 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13170 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13190 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
131a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
131b0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
131c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
131d0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
131e0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
131f0 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->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 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13220 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
13230 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
13240 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13250 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13260 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
13270 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
13280 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
132a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
132b0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
132c0 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
132d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
132e0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
132f0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
13300 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
13310 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13330 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13340 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
13350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
13360 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13380 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
13390 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
133a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
133b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
133c0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
133d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  d\n", pPager)). 
133e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
133f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13400 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
13410 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20  l_fsync);.      
13420 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
13430 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
13440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
13450 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
13460 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
13470 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
13480 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
13490 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
134a0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
134b0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
134c0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
134d0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
134e0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
134f0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
13500 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
13510 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
13520 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
13530 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
13540 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
13550 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
13560 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
13570 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
13580 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
13590 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
135a0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
135b0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
135c0 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
135d0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
135e0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
135f0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
13600 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
13610 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
13620 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
13630 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
13640 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
13650 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13660 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
13670 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
13680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13690 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
136a0 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
136b0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
136c0 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
136d0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
136e0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
136f0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
13700 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
13710 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
13720 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
13730 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
13740 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
13750 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
13760 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
13770 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
13780 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
13790 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
137a0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
137b0 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
137c0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
137d0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
137e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
137f0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
13800 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13810 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
13820 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
13830 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
13840 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13850 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
13860 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
13870 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
13880 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
13890 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
138a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
138b0 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
138c0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
138d0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
138e0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
138f0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
13900 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
13910 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
13920 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
13930 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
13940 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
13950 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
13960 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
13970 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69  _BUCKET 25.stati
13980 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
13990 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
139a0 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
139b0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a  _SORT_BUCKET], *
139c0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
139d0 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
139e0 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
139f0 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
13a00 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
13a10 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
13a20 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13a30 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
13a40 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
13a50 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
13a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
13a70 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
13a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
13a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
13aa0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13ab0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
13ac0 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
13ad0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13ae0 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
13af0 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b  ET-1 ){.      a[
13b00 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
13b10 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
13b20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
13b30 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
13b40 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
13b50 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
13b60 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
13b70 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
13b80 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
13b90 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
13ba0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
13bb0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
13bc0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
13bd0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
13be0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
13bf0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
13c00 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
13c10 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
13c20 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
13c30 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
13c40 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
13c50 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
13c60 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
13c70 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
13c80 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
13c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
13ca0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
13cb0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
13cc0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
13cd0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
13ce0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
13cf0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
13d00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13d10 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
13d20 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
13d30 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
13d40 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
13d50 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
13d60 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
13d70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
13d80 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
13d90 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
13da0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
13db0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
13dc0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
13dd0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13de0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
13df0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
13e00 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
13e10 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
13e20 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
13e30 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
13e40 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
13e50 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
13e60 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
13e70 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
13e80 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
13e90 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
13ea0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
13eb0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
13ec0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
13ed0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
13ee0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13ef0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
13f00 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
13f10 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13f20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
13f30 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
13f40 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
13f50 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
13f60 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
13f70 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
13f80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13f90 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
13fa0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
13fb0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
13fc0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
13fd0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
13fe0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
13ff0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
14000 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
14010 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
14020 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
14030 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14040 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
14050 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
14060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14070 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14080 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
14090 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
140a0 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
140b0 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
140c0 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
140d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
140e0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
140f0 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
14100 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
14110 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14120 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14130 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
14140 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
14150 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
14160 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
14170 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
14180 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
14190 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
141a0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
141b0 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
141c0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
141d0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
141e0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
141f0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
14200 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
14210 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
14220 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
14230 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
14240 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
14250 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
14260 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63  bSize ){.      c
14270 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44  har *pData = COD
14280 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC2(pPager, PGHD
14290 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
142a0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
142b0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
142c0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
142d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
142e0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
142f0 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  no);.      IOTRA
14300 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
14310 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
14320 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  st->pgno)).     
14330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
14340 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
14350 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
14360 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14370 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
14380 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
14390 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
143a0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
143b0 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
143c0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
143d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
143e0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
143f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14400 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14410 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
14420 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
14430 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
14440 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
14450 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
14460 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
14470 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
14480 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
14490 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
144a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
144b0 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
144c0 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
144d0 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
144e0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
144f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
14500 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
14510 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
14520 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
14530 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
14540 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
14550 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
14560 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
14570 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
14580 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
14590 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
145a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
145b0 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
145c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
145d0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
145e0 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
145f0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
14600 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
14610 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
14620 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
14630 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
14640 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
14650 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
14660 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
14670 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
14680 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
14690 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
146a0 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
146b0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
146c0 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
146d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
146e0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
146f0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
14700 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
14710 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
14720 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
14730 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69  if( !sqlite3OsFi
14740 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
14750 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74  >zJournal) ) ret
14760 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
14770 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
14780 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
14790 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
147a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
147b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
147c0 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
147d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
147e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
147f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
14810 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
14820 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
14830 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
14840 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
14850 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
14860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
14870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14880 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
14890 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
148a0 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
148b0 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
148c0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
148d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
148e0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
148f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14900 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
14910 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
14920 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
14930 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20  0;..  /* Find a 
14940 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
14950 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
14960 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
14970 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72   not.  ** requir
14980 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
14990 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
149a0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  rnal..  */.  pPg
149b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
149c0 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49  tSynced;..  /* I
149d0 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
149e0 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
149f0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
14a00 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a   an fsync().  **
14a10 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
14a20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
14a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14a40 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a  .  This is a.  *
14a50 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
14a60 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
14a70 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
14a80 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
14a90 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74  es.  ** it can't
14aa0 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f   be helped..  */
14ab0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26  .  if( pPg==0 &&
14ac0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
14ad0 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45  && syncOk && !ME
14ae0 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  MDB){.    int rc
14af0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
14b00 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14b10 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
14b20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14b30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14b40 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
14b50 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
14b60 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
14b70 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
14b80 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
14b90 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
14ba0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
14bb0 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
14bc0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
14bd0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
14be0 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
14bf0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
14c00 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
14c10 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
14c20 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
14c30 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
14c40 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
14c50 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
14c60 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
14c70 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
14c80 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
14c90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
14ca0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
14cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14cc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14cd0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
14ce0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
14cf0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
14d00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
14d10 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
14d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
14d40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14d50 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
14d60 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
14d70 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
14d80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14da0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
14db0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
14dc0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
14dd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14de0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
14df0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
14e00 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
14e10 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
14e20 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
14e30 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
14e40 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
14e50 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
14e60 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
14e70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
14e80 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
14e90 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
14ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14eb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
14ec0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
14ed0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
14ee0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
14ef0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
14f00 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
14f10 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14f20 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
14f30 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
14f40 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
14f50 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
14f60 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
14f70 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
14f80 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
14f90 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
14fa0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
14fb0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
14fc0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
14fd0 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
14fe0 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
14ff0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
15000 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
15010 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
15020 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
15030 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
15040 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
15050 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
15060 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
15070 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
15080 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
15090 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
150a0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
150b0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
150c0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
150d0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
150e0 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ck ){.    IOTRAC
150f0 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42  E(("ALWAYS_ROLLB
15100 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  ACK %p\n", pPage
15110 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r)).    pPager->
15120 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
15130 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
15140 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
15150 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
15160 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
15170 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
15180 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
15190 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
151a0 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a  er->nOvfl);..  *
151b0 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
151c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
151d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
151e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
151f0 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
15200 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
15210 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
15220 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
15230 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
15240 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
15250 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
15260 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
15270 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
15280 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
15290 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
152a0 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
152b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
152c0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
152d0 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
152e0 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
152f0 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
15300 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
15310 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
15320 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
15330 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
15340 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
15350 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
15360 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
15370 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
15380 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
15390 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
153a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
153b0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
153c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
153d0 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e  ReleaseMemory(in
153e0 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74  t nReq){.  const
153f0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
15400 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
15410 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
15420 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20  );.  Pager *p;. 
15430 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
15440 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
15450 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
15460 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
15470 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
15480 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
15490 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
154a0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
154b0 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
154c0 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
154d0 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
154e0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
154f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
15500 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
15510 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
15520 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
15530 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
15540 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
15550 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
15560 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
15570 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
15580 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
15590 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
155a0 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
155b0 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
155c0 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
155d0 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
155e0 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
155f0 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
15600 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
15610 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
15620 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
15630 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
15640 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
15650 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
15660 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
15670 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
15680 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
15690 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
156a0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
156b0 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
156c0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
156d0 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
156e0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
156f0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
15700 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
15710 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70   for(p=pTsdro->p
15720 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65  Pager; p && (nRe
15730 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
15740 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65  <nReq); p=p->pNe
15750 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
15760 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
15770 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   rc;..      /* F
15780 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
15790 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
157a0 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
157b0 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
157c0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
157d0 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
157e0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
157f0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
15800 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
15810 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
15820 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
15830 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
15840 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c  pager_recycle(p,
15850 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
15860 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
15870 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
15880 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
15890 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
158a0 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
158b0 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
158c0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
158d0 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
158e0 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
158f0 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
15900 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
15910 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
15920 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
15930 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
15940 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
15950 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
15960 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
15970 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
15980 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
15990 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
159a0 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
159b0 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
159c0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
159d0 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
159e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
159f0 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
15a00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15a10 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
15a20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
15a30 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
15a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
15a50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  g==p->pAll ){.  
15a60 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c           p->pAll
15a70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
15a80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15a90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
15aa0 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54  pTmp=p->pAll; pT
15ab0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
15ac0 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
15ad0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
15ae0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
15af0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
15b00 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
15b10 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
15b20 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
15b30 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
15b40 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
15b50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15b60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
15b80 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
15b90 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
15ba0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
15bb0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
15bc0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
15bd0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
15be0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
15bf0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
15c00 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
15c10 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
15c20 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
15c30 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
15c40 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
15c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
15c60 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
15c70 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
15c80 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
15c90 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
15ca0 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
15cb0 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
15cc0 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
15cd0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
15ce0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
15cf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
15d00 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  rt( (rc&0xff)==S
15d10 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
15d20 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
15d30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15d40 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
15d50 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
15d60 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
15d70 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  r(p, rc);.      
15d80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
15d90 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b  eturn nReleased;
15da0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15db0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
15dc0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a  Y_MANAGEMENT */.
15dd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15de0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15df0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
15e00 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
15e10 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
15e20 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
15e30 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
15e40 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
15e50 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
15e60 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
15e70 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
15e80 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
15e90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15ea0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
15eb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
15ec0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15ed0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15ee0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
15ef0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  LOCK ){.    if( 
15f00 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
15f10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15f20 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
15f30 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
15f40 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
15f50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
15f60 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
15f70 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
15f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15fa0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15fb0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15fc0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
15fd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
15fe0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15ff0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
16000 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
16010 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
16020 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
16030 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
16040 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
16050 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
16060 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
16070 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
16080 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
16090 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
160a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
160b0 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  ( hasHotJournal(
160c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
160d0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
160e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
160f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16100 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
16110 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
16120 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16130 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16140 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
16150 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
16160 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43  e.        ** EXC
16170 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
16180 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
16190 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
161a0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  pen the.        
161b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
161c0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
161d0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
161e0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
161f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
16200 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
16210 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
16220 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
16230 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
16240 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
16250 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
16260 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
16270 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
16280 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16290 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
162a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  he.        ** se
162b0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
162c0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
162d0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
162e0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
162f0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
16300 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
16310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16320 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
16330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
16340 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
16350 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
16360 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
16370 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16390 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
163a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
163b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
163c0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
163d0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
163e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
163f0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
16400 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20  CLUSIVE;. .     
16410 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
16420 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
16430 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
16440 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
16450 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72          ** we ar
16460 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
16470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16480 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  e. .        **. 
16490 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
164a0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
164b0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
164c0 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
164d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
164e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
164f0 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
16500 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
16510 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
16520 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
16530 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
16540 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
16550 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
16560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
16570 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
16580 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
16590 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
165a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
165b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
165c0 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
165d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
165e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
165f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16610 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
16620 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16640 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
16650 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16660 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
16670 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
16680 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
16690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
166a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
166b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
166c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
166d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
166e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
166f0 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  = 0;. .        /
16700 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
16710 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
16720 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
16730 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
16740 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
16750 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
16760 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
16770 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
16780 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
16790 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
167a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
167b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
167c0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
167d0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
167e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
167f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16800 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
16810 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
16820 50 61 67 65 31 20 3d 20 70 61 67 65 72 5f 6c 6f  Page1 = pager_lo
16830 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
16840 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
16850 67 65 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ge1 ){.         
16860 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
16870 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31 29  (pPager, pPage1)
16880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16890 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
168a0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
168b0 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r, 1) );.       
168c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
168d0 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
168e0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
168f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 09  ==SQLITE_OK ){..
16910 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 2d    /* The change-
16920 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f 72 65  counter is store
16930 64 20 61 74 20 6f 66 66 73 65 74 20 32 34 2e 20  d at offset 24. 
16940 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20 20 20  See also.       
16950 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
16960 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
16970 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
16980 20 20 20 20 20 20 20 20 20 75 33 32 20 69 43 68           u32 iCh
16990 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74 72  angeCount = retr
169a0 69 65 76 65 33 32 62 69 74 73 28 70 50 61 67 65  ieve32bits(pPage
169b0 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  1, 24);.        
169c0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
169d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
169e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
169f0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
16a00 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
16a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
16a20 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70 50 61  ChangeCount!=pPa
16a30 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e  ger->iChangeCoun
16a40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16a50 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
16a60 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16a70 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  }.          pPag
16a80 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74  er->iChangeCount
16a90 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 3b   = iChangeCount;
16aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16ab0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
16ac0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16ad0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 0a 0a  ER_SHARED;.  }..
16ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16af0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
16b00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
16b10 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
16b20 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
16b30 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
16b40 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
16b50 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
16b60 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
16b70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
16b80 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
16b90 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
16ba0 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
16bb0 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
16bc0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
16bd0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
16be0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
16bf0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
16c00 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
16c10 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
16c20 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
16c30 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
16c40 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
16c50 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
16c60 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
16c70 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
16c80 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
16c90 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
16ca0 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
16cb0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
16cc0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
16cd0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
16ce0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
16cf0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
16d00 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
16d10 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
16d20 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
16d30 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
16d40 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
16d50 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
16d60 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
16d70 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
16d80 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
16d90 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
16da0 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74  and _lookup() at
16db0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
16dc0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
16dd0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
16de0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
16df0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
16e00 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
16e10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
16e20 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
16e30 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
16e40 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
16e50 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
16e60 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
16e70 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
16e80 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
16e90 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
16ea0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
16eb0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
16ec0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
16ed0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
16ee0 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
16ef0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
16f00 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
16f10 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
16f20 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
16f30 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
16f40 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61 6c  f clrFlag is fal
16f50 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
16f60 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
16f70 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
16f80 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67  k..** If clfFlag
16f90 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
16fa0 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
16fb0 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73 65  bout to be erase
16fc0 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74  d and.** rewritt
16fd0 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73 74  en without first
16fe0 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20 74   being read so t
16ff0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
17000 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65   it doing.** the
17010 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
17020 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
17030 71 75 69 72 65 28 50 61 67 65 72 20 2a 70 50 61  quire(Pager *pPa
17040 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
17050 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
17060 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20   int clrFlag){. 
17070 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
17080 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
17090 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
170a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
170b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20   pPager->nRef>0 
170c0 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20  || pgno==1 );.. 
170d0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
170e0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
170f0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
17100 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
17110 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
17120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
17130 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
17140 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
17150 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
17160 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
17170 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
17180 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
17190 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
171a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
171b0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
171c0 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
171d0 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
171e0 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
171f0 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
17200 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
17210 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
17220 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17230 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
17240 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
17250 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
17260 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
17270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17280 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
17290 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
172a0 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
172b0 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
172c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
172d0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
172e0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  () is a no-op if
172f0 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73   .  ** a databas
17300 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  e lock is alread
17310 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72  y held..  */.  r
17320 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c  c = pagerSharedL
17330 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
17340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17350 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17360 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
17370 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
17380 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
17390 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
173a0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
173b0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
173c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
173d0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
173e0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
173f0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
17400 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f  int h;.    TEST_
17410 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
17420 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ss);.    if( pPa
17430 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
17440 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
17450 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
17460 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20 20 20 20  | MEMDB ||.     
17470 20 20 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72     (pPager->pFir
17480 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70  stSynced==0 && p
17490 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
174a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
174b0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
174c0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
174d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
174e0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
174f0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
17500 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
17510 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
17520 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73      pPager->nHas
17530 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50  h<256 ? 256 : pP
17540 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a  ager->nHash*2);.
17550 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
17560 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
17570 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17580 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
175a0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
175b0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
175c0 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
175d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->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 2b 20 73 69              + si
17600 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
17610 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->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 2b 20 4d 45 4d 44 42           + MEMDB
17640 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
17650 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y) );.      if( 
17660 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
17670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17680 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
17690 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
176a0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
176b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
176c0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  DB ){.        me
176d0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
176e0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
176f0 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
17700 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
17710 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
17720 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
17730 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
17740 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
17750 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
17760 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
17770 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
17780 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
17790 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  r->nPage>pPager-
177a0 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20  >nMaxPage ){.   
177b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
177c0 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
177d0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
177e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
177f0 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a  er->nMaxPage++;.
17800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
17810 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
17820 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
17830 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  er, 1, &pPg);.  
17840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17870 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
17880 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17890 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
178a0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 67        assert(pPg
178b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
178c0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
178d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
178e0 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
178f0 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
17900 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
17910 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
17920 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
17930 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
17940 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
17950 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17960 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
17970 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
17980 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
17990 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
179a0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
179b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
179c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
179d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
179e0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
179f0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
17a00 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
17a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
17a20 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
17a30 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
17a40 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
17a50 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
17a60 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
17a70 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
17a80 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
17a90 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
17aa0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
17ab0 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
17ac0 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
17ad0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
17ae0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
17af0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  );.    pPg->nRef
17b00 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
17b10 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61  O(pPg);..    pPa
17b20 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
17b30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
17b40 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
17b50 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
17b60 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
17b70 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
17b80 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
17b90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
17ba0 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Code ){.      sq
17bb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
17bc0 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pPg);.      rc =
17bd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
17bf0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
17c00 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
17c10 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
17c20 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
17c30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17c40 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
17c50 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
17c60 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
17c70 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
17c80 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
17c90 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
17ca0 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  r)<(int)pgno || 
17cb0 4d 45 4d 44 42 0a 20 20 20 20 20 20 20 20 20 7c  MEMDB.         |
17cc0 7c 20 28 63 6c 72 46 6c 61 67 20 26 26 20 21 70  | (clrFlag && !p
17cd0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
17ce0 6c 62 61 63 6b 29 20 0a 20 20 20 20 29 7b 0a 20  lback) .    ){. 
17cf0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
17d00 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
17d10 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
17d20 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
17d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
17d40 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20  EMDB==0 );.     
17d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
17d60 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
17d70 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17d80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17d90 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17dc0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17dd0 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
17de0 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20  (pPg),.         
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
17e10 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
17e20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
17e30 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
17e40 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20  Pager, pgno)).  
17e50 20 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43      TRACE3("FETC
17e60 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
17e70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
17e80 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
17e90 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
17ea0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
17eb0 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
17ec0 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
17ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
17ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
17ef0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
17f00 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
17f10 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
17f20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
17f30 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
17f40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
17f60 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
17f70 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d  >nRead);.      }
17f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
17f90 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
17fa0 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
17fb0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
17fc0 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
17fd0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
17fe0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
17ff0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
18000 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
18010 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
18020 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
18030 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
18040 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
18050 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
18060 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
18070 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
18080 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
18090 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
180a0 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
180b0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
180c0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
180d0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
180e0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
180f0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
18100 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
18110 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
18120 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
18130 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
18140 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
18150 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54 45 53 54  no==1);.    TEST
18160 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
18170 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  it);.    page_re
18180 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
18190 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72  pPage = pPg;.  r
181a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
181b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
181c0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
181d0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
181e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
181f0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
18200 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
18210 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
18220 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
18230 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
18240 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
18250 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
18260 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
18270 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
18280 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
18290 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
182a0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
182b0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
182c0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
182d0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
182e0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
182f0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
18300 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18310 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
18320 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
18330 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
18340 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
18350 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
18360 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
18370 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
18380 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
18390 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
183a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
183b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
183c0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
183d0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
183e0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
183f0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  =0 );..  if( pPa
18400 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
18410 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
18420 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
18430 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d  >pAll || pPager-
18440 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
18450 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18460 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
18470 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
18480 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
18490 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
184a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
184b0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
184c0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
184d0 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
184e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
184f0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
18500 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
18510 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
18520 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
18530 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
18540 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
18550 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
18560 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
18570 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
18580 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
18590 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
185a0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
185b0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
185c0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
185d0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
185e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
185f0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
18600 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
18610 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
18620 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  ){..  /* Decreme
18630 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
18640 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
18650 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  page.  */.  asse
18660 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
18670 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
18680 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
18690 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
186a0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
186b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
186c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
186d0 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
186e0 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
186f0 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
18700 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
18710 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
18720 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
18730 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
18740 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
18750 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
18760 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
18770 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
18780 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
18790 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
187a0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
187b0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
187c0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
187d0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
187e0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
187f0 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
18800 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
18810 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
18820 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
18830 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
18840 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
18850 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
18860 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
18870 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
18880 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18890 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
188a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
188b0 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20  Destructor(pPg, 
188c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
188d0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
188e0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
188f0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
18900 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
18910 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
18920 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
18930 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
18940 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
18950 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
18960 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
18970 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18980 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18990 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
189a0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
189b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
189c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
189d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
189e0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
189f0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
18a00 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
18a10 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
18a20 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
18a30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18a40 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
18a50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18a60 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
18a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
18a80 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
18a90 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
18aa0 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
18ab0 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
18ac0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18ad0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
18ae0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
18af0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
18b00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18b10 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
18b20 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18b30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18b40 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18b60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18b70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18b80 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18b90 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
18ba0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18bb0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
18bc0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18bd0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
18be0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
18bf0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
18c00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
18c10 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
18c20 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
18c30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
18c40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18c50 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
18c60 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
18c70 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
18c80 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
18c90 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
18ca0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
18cb0 0a 20 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 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
18ce0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
18cf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
18d00 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
18d10 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
18d20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
18d30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
18d50 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
18d60 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
18d70 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
18d80 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
18d90 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
18da0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
18db0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
18dc0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
18dd0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
18de0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
18df0 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
18e00 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
18e10 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
18e20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18e30 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
18e40 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
18e50 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
18e60 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
18e70 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
18e80 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
18e90 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
18ea0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18eb0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
18ec0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
18ed0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
18ee0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
18ef0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
18f00 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
18f10 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
18f20 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
18f30 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
18f40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18f50 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
18f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18f80 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
18f90 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
18fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
18fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
18fc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
18fd0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
18fe0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
18ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19000 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19010 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19020 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19030 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
19040 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
19050 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
19060 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
19070 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19080 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
19090 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
190a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
190b0 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
190c0 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69  lure, then we wi
190d0 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e  ll not be closin
190e0 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  g the pager.    
190f0 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65  ** file. So dele
19100 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66  te any journal f
19110 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20  ile we may have 
19120 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74  just created. Ot
19130 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20  herwise,.    ** 
19140 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20  the system will 
19150 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65  get confused, we
19160 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63   have a read-loc
19170 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  k on the file an
19180 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65  d a.    ** myste
19190 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61  rious journal ha
191a0 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  s appeared in th
191b0 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20  e filesystem..  
191c0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
191d0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
191e0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65  >zJournal);.  }e
191f0 6c 73 65 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  lse{.    pager_r
19200 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19220 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
19230 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
19240 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
19250 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
19260 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
19270 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
19280 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
19290 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
192a0 67 65 72 43 6f 6d 6d 69 74 28 29 20 69 73 20 63  gerCommit() is c
192b0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
192c0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
192d0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
192e0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
192f0 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
19300 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
19310 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19320 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
19330 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
19340 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
19350 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
19360 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
19370 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
19380 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
19390 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
193a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
193b0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
193c0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
193d0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
193e0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
193f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19400 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
19410 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
19420 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
19430 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
19440 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19450 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
19460 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
19470 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
19480 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
19490 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
194a0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
194b0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
194c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
194d0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
194e0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
194f0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
19500 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
19510 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
19520 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
19530 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
19540 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
19550 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
19560 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
19570 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
19580 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
19590 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
195a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
195b0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
195c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
195d0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
195e0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
195f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
19600 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
19610 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
19620 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
19630 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
19640 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
19650 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
19660 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
19670 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
19680 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
19690 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
196a0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
196b0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
196c0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
196d0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
196e0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
196f0 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
19700 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
19710 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
19720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19730 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
19740 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19750 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
19760 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
19770 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19780 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
19790 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
197a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
197b0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
197c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
197d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
197e0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
197f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
19800 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
19810 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
19820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19830 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
19840 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
19850 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
19860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
19880 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
19890 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
198a0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
198b0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
198c0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
198d0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
198e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
198f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19900 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
19910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19920 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
19940 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
19950 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
19960 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
19970 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19980 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
19990 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
199a0 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
199b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
199c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
199d0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
199e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
199f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
19a00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19a10 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
19a20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
19a30 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
19a40 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
19a50 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
19a60 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
19a70 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
19a80 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
19a90 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
19aa0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
19ab0 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
19ac0 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
19ad0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
19ae0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
19af0 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
19b00 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
19b10 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65  pen and truncate
19b20 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20  d to 0 bytes..  
19b30 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
19b40 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30   pPager->nRec==0
19b50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19b60 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19b70 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ze==0 );.    sql
19b80 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19b90 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
19ba0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19bb0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
19bc0 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
19bd0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
19be0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
19bf0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
19c00 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
19c10 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
19c30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19c50 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
19c60 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
19c70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
19c80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19c90 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
19ca0 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
19cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
19cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19cd0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
19ce0 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74  e dirty.  Set it
19cf0 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64  s dirty flag and
19d00 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64   add it to the d
19d10 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73  irty.** page lis
19d20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
19d30 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64  d makeDirty(PgHd
19d40 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
19d50 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a  Pg->dirty==0 ){.
19d60 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
19d70 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
19d80 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
19d90 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
19da0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
19db0 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70  Dirty;.    if( p
19dc0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b  Pager->pDirty ){
19dd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
19de0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
19df0 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  y = pPg;.    }. 
19e00 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
19e10 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
19e20 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
19e30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
19e40 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e  ake a page clean
19e50 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72  .  Clear its dir
19e60 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76  ty bit and remov
19e70 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  e it from the.**
19e80 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74   dirty page list
19e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19ea0 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
19eb0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
19ec0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
19ed0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
19ee0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69      if( pPg->pDi
19ef0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
19f00 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
19f10 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65  irty = pPg->pPre
19f20 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  vDirty;.    }.  
19f30 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
19f40 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
19f50 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
19f60 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
19f70 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
19f80 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
19f90 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
19fa0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
19fb0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
19fc0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
19fd0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
19fe0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
19ff0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
1a000 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
1a010 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1a020 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
1a030 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
1a040 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
1a050 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
1a060 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
1a070 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1a080 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1a090 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
1a0a0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
1a0b0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
1a0c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1a0d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a0e0 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
1a0f0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
1a100 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
1a110 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1a120 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
1a130 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
1a140 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
1a150 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
1a160 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
1a170 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
1a180 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
1a190 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
1a1a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1a1b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1a1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
1a1d0 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
1a1e0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
1a1f0 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
1a200 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
1a210 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
1a220 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
1a230 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
1a240 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
1a250 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
1a260 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
1a270 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
1a280 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
1a290 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
1a2a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
1a2b0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
1a2c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1a2d0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
1a2e0 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
1a2f0 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
1a300 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
1a310 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
1a320 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
1a330 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1a340 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1a350 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a360 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
1a370 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
1a380 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a390 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
1a3a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1a3b0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1a3c0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1a3d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a3e0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
1a3f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1a400 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
1a410 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
1a420 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
1a430 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
1a440 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
1a450 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1a460 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1a470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
1a480 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
1a490 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
1a4a0 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
1a4b0 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  );.  if( pPg->in
1a4c0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
1a4d0 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
1a4e0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
1a4f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a500 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1a510 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
1a520 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
1a530 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
1a540 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1a550 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
1a560 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
1a570 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1a580 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
1a590 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
1a5a0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
1a5b0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1a5c0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
1a5d0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1a5e0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
1a5f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
1a600 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
1a610 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
1a620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a630 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1a640 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
1a650 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a660 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  in(pPg, 0);.    
1a670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a680 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1a690 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a6a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a6b0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1a6c0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
1a6d0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1a6e0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
1a6f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
1a700 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a710 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1a720 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1a730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a740 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a760 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a770 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
1a780 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
1a790 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1a7a0 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  e = 1;.  .    /*
1a7b0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1a7c0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
1a7d0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
1a7e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
1a7f0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1a800 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
1a810 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1a820 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
1a830 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
1a840 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
1a850 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
1a860 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1a870 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
1a880 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a     if( !pPg->inJ
1a890 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
1a8a0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
1a8b0 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20   MEMDB) ){.     
1a8c0 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
1a8d0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1a8e0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1a8f0 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
1a900 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
1a910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
1a920 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1a930 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1a940 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1a950 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a         TRACE3("J
1a960 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1a970 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1a980 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1a990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1a9a0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
1a9b0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
1a9c0 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
1a9d0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1a9e0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1a9f0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
1aa00 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1aa10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1aa20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
1aa30 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
1aa40 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1aa50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1aa60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aa70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1aa80 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65   u32 cksum, save
1aa90 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  d;.          cha
1aaa0 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64  r *pData2, *pEnd
1aab0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;.          /* W
1aac0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
1aad0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1aae0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
1aaf0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
1ab00 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
1ab10 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
1ab20 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1ab30 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
1ab40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
1ab50 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
1ab60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1ab70 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
1ab80 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1ab90 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
1aba0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1abb0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1abc0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
1abd0 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
1abe0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
1abf0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
1ac00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64  ;.          pEnd
1ac10 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67   = pData2 + pPag
1ac20 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1ac30 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d          pData2 -
1ac40 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 4;.          s
1ac50 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45  aved = *(u32*)pE
1ac60 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  nd;.          pu
1ac70 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b  t32bits(pEnd, ck
1ac80 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
1ac90 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
1aca0 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
1acb0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1acc0 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1acd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1ace0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1acf0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
1ad00 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20  ata2, szPg);.   
1ad10 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1ad20 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
1ad30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ad40 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1ad60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ad70 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20  , szPg)).       
1ad80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1ad90 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
1ada0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28           TRACE4(
1adb0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1adc0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1add0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ade0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1adf0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ae00 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
1ae10 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33  ;.          *(u3
1ae20 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b  2*)pEnd = saved;
1ae30 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ...  /* An error
1ae40 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69   has occured wri
1ae50 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
1ae60 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
1ae70 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e           ** tran
1ae80 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
1ae90 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
1aea0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
1aeb0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1aec0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1aed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1aef0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  c;.          }..
1af00 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1af10 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
1af20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1af30 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1af40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1af50 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1af60 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1af70 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1af80 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  7);.          pP
1af90 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1afa0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
1afb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
1afc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1afd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
1afe0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1aff0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1b000 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1b010 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1b020 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1b030 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
1b040 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b060 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1b070 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
1b080 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
1b090 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
1b0a0 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22 41         TRACE4("A
1b0b0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1b0c0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1b0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b0e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b0f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1b100 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1b110 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b120 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1b130 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b140 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1b150 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1b160 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1b170 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1b180 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1b190 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
1b1a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1b1b0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
1b1c0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
1b1d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1b1e0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
1b1f0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
1b200 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
1b210 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1b220 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
1b230 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
1b240 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
1b250 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
1b260 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
1b270 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
1b280 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
1b290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b2a0 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
1b2b0 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
1b2c0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
1b2d0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
1b2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1b2f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
1b300 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
1b310 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1b320 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   );.      if( ME
1b330 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
1b340 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1b350 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1b360 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1b370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
1b380 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
1b390 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
1b3a0 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  pStmt = sqliteMa
1b3b0 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
1b3c0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1b3d0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1b3e0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
1b3f0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
1b400 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
1b410 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1b420 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1b430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b440 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f   TRACE3("STMT-JO
1b450 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1b460 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1b470 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1b480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b490 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1b4a0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1b4b0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1b4c0 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20  >pgno, 7)-4;.   
1b4d0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1b4e0 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1b4f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b500 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1b510 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1b520 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1b530 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20  eSize+4);.      
1b540 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
1b550 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1b560 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b570 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1b580 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b5a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b5b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1b5c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1b5d0 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
1b5e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b5f0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1b600 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b610 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1b620 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1b630 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1b640 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64   }.      page_ad
1b650 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1b660 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1b670 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1b680 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
1b690 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
1b6a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b6b0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1b6c0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
1b6d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
1b6e0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
1b6f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b700 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
1b710 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
1b720 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b730 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
1b740 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1b750 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1b760 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
1b770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1b790 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1b7a0 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
1b7b0 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
1b7c0 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
1b7d0 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
1b7e0 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1b7f0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1b800 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
1b810 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
1b820 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
1b830 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1b840 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1b850 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
1b860 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
1b870 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
1b880 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1b890 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
1b8a0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
1b8b0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
1b8c0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
1b8d0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
1b8e0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
1b8f0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
1b900 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
1b910 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
1b920 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1b930 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
1b940 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
1b950 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
1b960 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1b970 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1b980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1b990 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1b9a0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1b9b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b9c0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
1b9d0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
1b9e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
1b9f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ba00 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  );..  if( !MEMDB
1ba10 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
1ba20 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1ba30 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1ba40 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1ba50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1ba60 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1ba70 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1baa0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1bab0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1bac0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1bad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1baf0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1bb00 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1bb10 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20  /.    int ii;.. 
1bb20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
1bb30 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
1bb40 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
1bb50 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
1bb60 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
1bb70 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
1bb80 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
1bb90 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
1bba0 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
1bbb0 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
1bbc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bbd0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
1bbe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1bbf0 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
1bc00 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
1bc10 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
1bc20 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
1bc30 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
1bc40 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
1bc50 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
1bc60 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
1bc70 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
1bc80 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
1bc90 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
1bca0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1bcb0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1bcc0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
1bcd0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
1bce0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
1bcf0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
1bd00 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
1bd10 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1bd20 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1bd30 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1bd40 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
1bd50 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
1bd60 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
1bd70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1bd80 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
1bd90 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
1bda0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1bdb0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
1bdc0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
1bdd0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1bde0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
1bdf0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1be00 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
1be10 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
1be20 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
1be30 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
1be40 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
1be50 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
1be60 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1be70 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
1be80 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
1be90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1bea0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1beb0 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  || pg==pPg->pgno
1bec0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
1bed0 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  g>pPager->origDb
1bee0 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72  Size || !(pPager
1bef0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f  ->aInJournal[pg/
1bf00 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a  8]&(1<<(pg&7))).
1bf10 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20        ) {.      
1bf20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
1bf30 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1bf40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
1bf50 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
1bf60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bf70 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1bf80 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1bf90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1bfc0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1bfd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1bfe0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1bff0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1c000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1c010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1c020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c030 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
1c040 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1c050 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
1c060 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1c070 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
1c080 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1c090 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1c0a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1c0b0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
1c0c0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
1c0d0 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
1c0e0 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
1c0f0 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
1c100 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1c110 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
1c120 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
1c130 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
1c140 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
1c150 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
1c160 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
1c170 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
1c180 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
1c190 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
1c1a0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1c1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
1c1c0 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
1c1d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1c1e0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
1c1f0 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
1c200 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
1c210 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
1c220 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1c230 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
1c240 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1c250 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
1c260 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1c270 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1c280 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1c290 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
1c2a0 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  &pPg);.  if( rc=
1c2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c2c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c2d0 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1c2e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c2f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1c300 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65  mcpy(sqlite3Page
1c310 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70  rGetData(pPg), p
1c320 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1c330 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1c340 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1c350 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  nref(pPg);.  }. 
1c360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1c370 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
1c380 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
1c390 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
1c3a0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
1c3b0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
1c3c0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
1c3d0 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
1c3e0 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
1c3f0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
1c400 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
1c410 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
1c420 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
1c430 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
1c440 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
1c450 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1c460 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
1c470 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
1c480 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
1c490 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
1c4a0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
1c4b0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
1c4c0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
1c4d0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
1c4e0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
1c4f0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
1c500 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1c510 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
1c520 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1c530 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
1c540 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1c550 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1c560 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1c570 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1c580 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1c590 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1c5a0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1c5b0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1c5c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1c5d0 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1c5e0 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1c5f0 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1c600 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
1c610 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1c620 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1c630 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1c640 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1c650 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1c660 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1c670 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1c680 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1c690 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1c6a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1c6b0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1c6c0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1c6d0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1c6e0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1c6f0 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1c700 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1c710 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1c720 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1c730 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1c740 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1c750 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1c760 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1c770 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1c780 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1c790 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
1c7a0 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
1c7b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1c7c0 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
1c7d0 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
1c7e0 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1c7f0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1c800 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
1c810 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1c820 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
1c830 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
1c840 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
1c850 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
1c860 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1c870 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1c880 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1c890 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  f( MEMDB ) retur
1c8a0 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  n;..  pPg = page
1c8b0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1c8c0 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
1c8d0 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20  ( pPg!=0 );  /* 
1c8e0 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64  We never call _d
1c8f0 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73  ont_write unless
1c900 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 20   the page is in 
1c910 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c  mem */.  pPg->al
1c920 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1c930 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
1c940 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
1c950 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1c960 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c970 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1c980 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1c990 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
1c9a0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
1c9b0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1c9c0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
1c9d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
1c9e0 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
1c9f0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1ca00 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
1ca10 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
1ca20 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
1ca30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1ca40 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
1ca50 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
1ca60 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
1ca70 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
1ca80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
1ca90 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
1caa0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1cab0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
1cac0 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
1cad0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
1cae0 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
1caf0 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
1cb00 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
1cb10 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
1cb20 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
1cb30 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
1cb40 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
1cb50 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
1cb60 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
1cb70 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
1cb80 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
1cb90 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
1cba0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
1cbb0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
1cbc0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1cbd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cbe0 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52   TRACE3("DONT_WR
1cbf0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
1cc00 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45  d\n", pgno, PAGE
1cc10 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1cc20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
1cc30 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
1cc40 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20  ager, pgno)).   
1cc50 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1cc60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1cc70 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1cc80 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1cc90 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1cca0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1ccb0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ccc0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1ccd0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1cce0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1ccf0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1cd00 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1cd10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1cd20 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1cd30 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1cd40 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1cd50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1cd60 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1cd70 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1cd80 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1cd90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1cda0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1cdb0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1cdc0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1cdd0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1cde0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1cdf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1ce00 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1ce10 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
1ce20 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1ce30 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1ce40 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1ce50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1ce60 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1ce70 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1ce80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1ce90 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1cea0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1ceb0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1cec0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1ced0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cee0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1cef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1cf00 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1cf10 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1cf20 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1cf30 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1cf40 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1cf50 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1cf60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1cf70 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1cf80 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1cf90 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
1cfa0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1cfb0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1cfc0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1cfd0 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
1cfe0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1cff0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1d000 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52  ager));.    IOTR
1d010 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
1d020 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1d030 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a  pPg->pgno)).  }.
1d040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d050 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
1d060 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
1d070 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
1d080 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
1d090 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1d0a0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
1d0b0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
1d0c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1d0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1d0e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
1d0f0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1d100 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1d110 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1d120 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
1d130 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1d140 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ist(pPg);.  }.}.
1d150 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1d160 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
1d170 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1d180 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1d190 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1d1a0 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
1d1b0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
1d1c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
1d1d0 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
1d1e0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1d1f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
1d200 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
1d210 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
1d220 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
1d230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1d240 65 72 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  erCommit(Pager *
1d250 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d260 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
1d270 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1d280 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1d290 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1d2a0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1d2b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
1d2c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
1d2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d2e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1d2f0 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
1d300 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1d310 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1d320 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
1d330 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1d340 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1d350 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
1d360 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  Pg ){.      clea
1d370 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
1d380 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1d390 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  er));.      pPg-
1d3a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1d3b0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1d3c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d3d0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1d3e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1d3f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d400 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1d410 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1d420 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
1d430 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
1d440 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1d450 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
1d460 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
1d470 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1d480 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1d490 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1d4a0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1d4b0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1d4c0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1d4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1d4e0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1d4f0 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
1d500 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
1d510 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d520 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
1d530 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1d540 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1d550 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1d560 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1d570 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1d580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d590 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1d5a0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
1d5b0 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
1d5c0 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
1d5d0 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
1d5e0 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
1d5f0 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
1d600 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
1d610 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
1d620 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1d630 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
1d640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1d650 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1d660 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1d670 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1d680 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1d690 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d6a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d6b0 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
1d6c0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d6d0 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ager, 0, 0);.  i
1d6e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d6f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1d700 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1d710 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
1d720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d730 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
1d740 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
1d750 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
1d760 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1d770 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
1d780 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
1d790 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
1d7a0 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
1d7b0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
1d7c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
1d7d0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
1d7e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1d7f0 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
1d800 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
1d810 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
1d820 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1d830 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1d840 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
1d850 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
1d860 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
1d870 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
1d880 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
1d890 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
1d8a0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
1d8b0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
1d8c0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
1d8d0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
1d8e0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
1d8f0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
1d900 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
1d910 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
1d920 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
1d930 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1d940 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1d950 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1d960 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1d970 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1d980 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
1d990 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1d9a0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1d9b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
1d9c0 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
1d9d0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1d9e0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
1d9f0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1da00 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
1da10 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
1da20 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1da30 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
1da40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
1da50 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
1da60 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
1da70 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
1da80 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
1da90 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
1daa0 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
1dab0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
1dac0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
1dad0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dae0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
1daf0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1db00 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
1db10 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1db20 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
1db30 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
1db40 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
1db50 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
1db60 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1db70 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41    TRACE3("ROLLBA
1db80 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
1db90 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
1dba0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1dbb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dbc0 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47       TRACE3("PAG
1dbd0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
1dbe0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
1dbf0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1dc00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dc10 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
1dc20 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
1dc30 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1dc40 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
1dc50 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
1dc60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
1dc70 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
1dc80 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1dc90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1dca0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
1dcb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1dcc0 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
1dcd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1dce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1dcf0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1dd00 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1dd10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1dd20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1dd30 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1dd40 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
1dd50 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1dd60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1dd70 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1dd80 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1dd90 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1dda0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ddb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
1ddc0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1ddd0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
1dde0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1ddf0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1de00 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1de10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1de20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1de30 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
1de40 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
1de50 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
1de60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1de70 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
1de80 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
1de90 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1dea0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
1deb0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1dec0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
1ded0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1dee0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
1def0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
1df00 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1df10 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1df20 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
1df30 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1df40 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1df50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1df60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1df70 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
1df80 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1df90 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1dfa0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 50 61  r, 0);.  }.  pPa
1dfb0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1dfc0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
1dfd0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1dfe0 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
1dff0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
1e000 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
1e010 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
1e020 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
1e030 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
1e040 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
1e050 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
1e060 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
1e070 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1e080 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1e090 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1e0a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e0b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1e0c0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1e0d0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1e0e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1e0f0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1e100 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1e110 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1e120 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1e130 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1e140 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1e150 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e160 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1e170 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1e180 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e190 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1e1a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e1b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1e1c0 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
1e1d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1e1e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e1f0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1e200 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
1e210 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
1e220 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
1e230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e240 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
1e250 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
1e260 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
1e270 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
1e280 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
1e290 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
1e2a0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
1e2b0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
1e2c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
1e2d0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
1e2e0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
1e2f0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
1e300 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
1e310 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
1e320 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
1e330 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
1e340 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
1e350 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
1e360 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
1e370 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
1e380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
1e390 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
1e3a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e3b0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
1e3c0 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
1e3d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1e3e0 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
1e3f0 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
1e400 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
1e410 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
1e420 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
1e430 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
1e440 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
1e450 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
1e460 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
1e470 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e480 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
1e490 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e4a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1e4b0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
1e4c0 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
1e4d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e4e0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1e4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e500 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
1e510 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d  .  TRACE2("STMT-
1e520 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
1e530 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1e540 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1e550 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1e560 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
1e570 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
1e580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1e590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e5a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1e5b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1e5c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
1e5d0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1e5e0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1e5f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1e600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e610 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1e620 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
1e630 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1e640 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
1e650 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
1e660 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e670 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
1e680 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1e690 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
1e6a0 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
1e6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e6c0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
1e6d0 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
1e6e0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1e6f0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
1e700 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
1e710 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1e720 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1e730 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
1e740 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
1e750 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1e760 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
1e770 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1e780 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
1e790 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
1e7a0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
1e7b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1e7c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
1e7d0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
1e7e0 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
1e7f0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
1e800 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1e810 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
1e820 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e830 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
1e840 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1e850 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1e860 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1e870 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1e880 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1e890 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1e8a0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1e8b0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1e8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8d0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1e8e0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1e8f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1e900 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1e910 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1e920 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1e930 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1e940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e950 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1e960 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1e970 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
1e980 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
1e990 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1e9a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e9b0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1e9c0 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54  g, *pNext;.    T
1e9d0 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
1e9e0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
1e9f0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1ea00 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1ea10 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
1ea20 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
1ea30 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
1ea40 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1ea50 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1ea60 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1ea70 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
1ea80 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
1ea90 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1eaa0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1eab0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
1eac0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
1ead0 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
1eae0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1eaf0 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mt;.      assert
1eb00 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b  ( pPg->inStmt );
1eb10 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1eb20 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1eb30 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
1eb40 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
1eb50 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  0;.      if( MEM
1eb60 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
1eb70 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1eb80 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1eb90 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1eba0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1ebb0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1ebc0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1ebd0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
1ebe0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1ebf0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
1ec00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1ec10 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
1ec20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1ec30 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1ec40 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1ec50 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
1ec60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ec70 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
1ec80 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1ec90 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
1eca0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1ecb0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1ecc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ecd0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
1ece0 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
1ecf0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
1ed00 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ed10 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1ed20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
1ed30 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
1ed40 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1ed50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1ed60 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
1ed70 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1ed80 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1ed90 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1eda0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1edb0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1edc0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1edd0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1ede0 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
1edf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1ee00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1ee10 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1ee20 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
1ee30 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1ee40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ee50 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1ee60 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1ee70 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
1ee80 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1ee90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1eea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eeb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eec0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
1eed0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1eee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1eef0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
1ef00 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
1ef10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1ef20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ef30 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1ef40 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1ef50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ef60 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1ef70 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1ef80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ef90 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1efa0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
1efb0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1efc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1efd0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
1efe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1eff0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
1f000 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f010 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1f020 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
1f030 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
1f040 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1f050 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
1f060 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
1f070 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
1f080 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
1f090 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
1f0a0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f0b0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
1f0c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f0d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1f0e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
1f0f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1f100 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
1f110 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
1f120 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
1f130 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1f140 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
1f150 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
1f160 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1f170 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
1f180 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1f190 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
1f1a0 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Sync;.}../*.** S
1f1b0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
1f1c0 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
1f1d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1f1e0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
1f1f0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
1f200 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
1f210 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
1f220 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
1f230 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
1f240 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
1f250 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
1f260 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
1f270 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
1f280 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f290 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1f2a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1f2b0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1f2c0 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1f2d0 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1f2e0 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1f2f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1f300 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1f310 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1f320 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
1f330 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1f340 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1f350 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
1f360 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1f370 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1f380 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1f390 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1f3a0 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
1f3b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f3c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f3e0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
1f3f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f400 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1f410 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1f420 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
1f430 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
1f440 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1f450 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
1f460 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
1f470 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1f480 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1f490 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1f4a0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1f4b0 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1f4c0 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32 62 69 74  er++;.  put32bit
1f4d0 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f  s(((char*)PGHDR_
1f4e0 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29  TO_DATA(pPgHdr))
1f4f0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1f500 74 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ter);.  pPager->
1f510 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63  iChangeCount = c
1f520 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1f530 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
1f540 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1f550 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 61 67   */.  sqlite3Pag
1f560 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
1f570 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1f580 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
1f590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f5a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1f5b0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1f5c0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1f5d0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1f5e0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1f5f0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1f600 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1f610 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f620 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1f630 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1f640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1f650 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1f660 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1f670 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1f680 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1f690 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1f6a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1f6b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f6c0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1f6d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1f6e0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1f6f0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1f700 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1f710 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1f720 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1f730 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1f740 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1f750 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1f760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1f770 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1f780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1f790 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1f7a0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1f7b0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1f7c0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1f7d0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1f7e0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1f7f0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1f800 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1f810 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1f820 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  c() call..**.** 
1f830 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
1f840 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
1f850 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
1f860 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
1f870 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
1f880 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
1f890 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1f8a0 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
1f8b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1f8c0 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
1f8d0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1f8e0 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1f8f0 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1f900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f910 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
1f920 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1f930 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1f940 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1f950 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f960 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1f970 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1f980 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1f990 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1f9a0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1f9b0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1f9c0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1f9d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f9e0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1f9f0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1fa00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1fa10 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1fa20 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1fa30 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1fa40 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1fa50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fa60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1fa70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1fa80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1fa90 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1faa0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1fab0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1fac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1fad0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1fae0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1faf0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1fb00 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1fb10 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1fb20 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1fb30 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1fb40 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1fb50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1fb60 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1fb70 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1fb80 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1fb90 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1fba0 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1fbb0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1fbc0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1fbd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1fbe0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1fbf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1fc00 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1fc10 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1fc20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fc40 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1fc50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fc60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1fc70 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1fc80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1fc90 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1fca0 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1fcb0 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1fcc0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1fcd0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1fce0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1fcf0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1fd00 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1fd10 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1fd20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1fd30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1fd40 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  o i;.        int
1fd50 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
1fd60 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a  J_PGNO(pPager);.
1fd70 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1fd80 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1fd90 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1fda0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1fdb0 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1fdc0 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1fdd0 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20   (1<<(i&7))) && 
1fde0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
1fdf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fe00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1fe10 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1fe20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1fe30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fe40 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fe50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1fe60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fe70 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1fe80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1fe90 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1fea0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1feb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fec0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fee0 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1fef0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1ff00 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1ff10 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1ff20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ff30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ff40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ff50 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1ff60 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1ff70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ff80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1ff90 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ffc0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1ffd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ffe0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1fff0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
20000 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20010 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20020 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20030 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
20040 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
20050 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
20060 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
20070 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
20080 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
20090 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
200a0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
200b0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
200c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
200d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
200e0 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  c_exit;..    /* 
200f0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
20100 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
20110 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
20120 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
20130 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
20140 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
20150 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
20160 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
20170 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
20180 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20190 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
201a0 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26  else if( MEMDB &
201b0 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  & nTrunc!=0 ){. 
201c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
201d0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
201e0 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
201f0 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
20200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
20210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20220 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
20230 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
20240 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
20250 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
20260 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
20270 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
20280 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
20290 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
202a0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
202b0 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
202c0 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
202d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
202e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
202f0 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
20300 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
20310 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
20320 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
20330 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
20340 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
20350 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
20360 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
20370 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20380 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
20390 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
203a0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
203b0 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
203c0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
203d0 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
203e0 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
203f0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
20400 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
20410 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
20420 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
20430 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
20440 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
20450 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
20460 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
20470 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
20480 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
20490 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
204a0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
204b0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
204c0 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
204d0 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
204e0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
204f0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
20500 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
20510 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
20520 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
20530 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20540 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
20550 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
20560 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
20570 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
20580 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
20590 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20  gHdr *pPgOld; . 
205a0 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e   int h;.  Pgno n
205b0 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
205c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
205d0 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52  >nRef>0 );..  TR
205e0 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
205f0 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
20600 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
20610 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
20620 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
20630 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
20640 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49  Sync, pgno);.  I
20650 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
20660 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
20670 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
20680 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d  no))..  if( pPg-
20690 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
206a0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
206b0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
206c0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
206d0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
206e0 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
206f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20700 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
20710 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
20720 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
20730 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
20740 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
20750 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
20760 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
20770 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
20780 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
20790 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
207a0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
207b0 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
207c0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
207d0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
207e0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
207f0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
20800 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
20810 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
20820 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
20830 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
20840 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
20850 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
20860 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
20870 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
20880 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
20890 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
208a0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
208b0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
208c0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
208d0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
208e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  );.    if( pPgOl
208f0 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
20900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
20910 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
20920 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
20930 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
20940 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
20950 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
20960 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
20970 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
20980 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
20990 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
209a0 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
209b0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
209c0 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
209d0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
209e0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  0 );.  pPg->pgno
209f0 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70   = pgno;.  h = p
20a00 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
20a10 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70  Hash-1);.  if( p
20a20 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
20a30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
20a40 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
20a50 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
20a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
20a70 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
20a80 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
20a90 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
20aa0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
20ab0 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
20ac0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
20ad0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
20ae0 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  ..  makeDirty(pP
20af0 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69  g);.  pPager->di
20b00 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
20b10 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
20b20 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
20b30 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
20b40 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
20b50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
20b60 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
20b70 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
20b80 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
20b90 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
20ba0 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
20bb0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
20bc0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
20bd0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
20be0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
20bf0 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
20c00 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
20c10 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
20c20 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
20c30 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
20c40 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
20c50 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
20c60 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
20c70 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
20c80 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
20c90 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
20ca0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
20cb0 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
20cc0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
20cd0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
20ce0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
20cf0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
20d00 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
20d10 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
20d20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64  int rc;.    PgHd
20d30 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
20d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
20d50 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
20d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d70 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
20d80 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
20d90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
20da0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20db0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
20dc0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
20dd0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65  .    pPgHdr->nee
20de0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
20df0 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  PgHdr->inJournal
20e00 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69   = 1;.    makeDi
20e10 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
20e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20e30 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
20e40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20e50 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
20e60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
20e70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
20e80 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
20e90 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
20ea0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
20eb0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
20ec0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg){.  return PG
20ed0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
20ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20ef0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
20f00 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
20f10 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
20f20 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
20f30 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
20f40 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
20f50 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
20f60 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
20f70 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
20f80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
20f90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
20fa0 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
20fb0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
20fc0 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a  Pg, pPager):0);.
20fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
20fe0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
20ff0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
21000 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
21010 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
21020 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
21030 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
21040 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
21050 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
21060 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
21070 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
21080 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
21090 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
210a0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
210b0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
210c0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
210d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
210e0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
210f0 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
21100 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
21110 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
21120 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
21130 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
21140 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
21150 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
21160 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
21170 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
21180 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
21190 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
211a0 6f 64 65 29 7b 0a 20 20 69 66 28 20 65 4d 6f 64  ode){.  if( eMod
211b0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
211c0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
211d0 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
211e0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
211f0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
21200 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  de;.}..#if defin
21210 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
21220 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
21230 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
21240 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
21250 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
21260 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
21270 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
21280 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
21290 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
212a0 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
212b0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
212c0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
212d0 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
212e0 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
212f0 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61 74  te3PagerLockstat
21300 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
21310 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
21320 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50  e3OsLockState(pP
21330 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e  ager->fd);.}.#en
21340 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
21350 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
21360 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
21370 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
21380 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
21390 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
213a0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
213b0 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  Refdump(Pager *p
213c0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
213d0 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
213e0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
213f0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
21400 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
21410 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
21420 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
21430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
21440 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70  PAGE %3d addr=%p
21450 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
21460 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
21470 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
21480 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
21490 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65    }.}.#endif..#e
214a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
214b0 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.