/ Hex Artifact Content
Login

Artifact 49fab8c32de2419cb549220d285c6399bc0d899e:


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 34  : pager.c,v 1.24
0350: 36 20 32 30 30 36 2f 30 31 2f 32 30 20 31 30 3a  6 2006/01/20 10:
0360: 35 35 3a 30 35 20 64 61 6e 69 65 6c 6b 31 39 37  55:05 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 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0620: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0630: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0640: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0650: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0660: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0670: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0680: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0690: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
06a0: 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a  akes an OsFile.*
06b0: 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  * struct as it's
06c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64   argument..*/.#d
06d0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 26 28   FILEHANDLEID(&(
06f0: 70 29 2d 3e 66 64 29 0a 23 64 65 66 69 6e 65 20  p)->fd).#define 
0700: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0710: 20 28 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 48   (sqlite3OsFileH
0720: 61 6e 64 6c 65 28 26 66 64 29 29 0a 0a 2f 2a 0a  andle(&fd))../*.
0730: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0740: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0750: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0770: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0780: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0790: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
07d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
07e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
07f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0800: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0820: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0830: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0840: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0860: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0870: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0880: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0890: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
08d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
08e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0910: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0920: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0950: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0960: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0970: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0980: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0990: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
09d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
09e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
09f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a20: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a30: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a40: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0a70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0a80: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0ab0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0ac0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0ad0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0af0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0b60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0b70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0b80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0ba0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bb0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0bc0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0bf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0c60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0c70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0c80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0cc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0cd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0cf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0dd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0eb0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ec0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ed0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0ee0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0ef0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0f00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0f10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0f20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0f30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0f40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0f50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0f60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0f70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0f80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0f90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0fb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0fc0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0fd0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0fe0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ff0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
1000: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
1010: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
1020: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
1030: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
1040: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
1050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
1060: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
1070: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
1080: 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a  ARED      1   /*
1090: 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f   same as SHARED_
10a0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
10c0: 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    2   /* same as
10d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a   RESERVED_LOCK *
10e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10f0: 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20  EXCLUSIVE   4   
1100: 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55  /* same as EXCLU
1110: 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  SIVE_LOCK */.#de
1120: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
1130: 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20  D      5../*.** 
1140: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  If the SQLITE_BU
1150: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1160: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f   macro is set to
1170: 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65   true at compile
1180: 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66  -time,.** then f
1190: 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74  ailed attempts t
11a0: 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64  o get a reserved
11b0: 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b   lock will invok
11c0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ack..** This is 
11e0: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20  off by default. 
11f0: 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e   To see why, con
1200: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1210: 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a  ing scenario:.**
1220: 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72   .** Suppose thr
1230: 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61  ead A already ha
1240: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1250: 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65  and wants a rese
1260: 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68  rved lock..** Th
1270: 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68  read B already h
1280: 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  as a reserved lo
1290: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20  ck and wants an 
12a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12b0: 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65   If.** both thre
12c0: 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  ads are using th
12d0: 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63  eir busy callbac
12e0: 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ks, it might be 
12f0: 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62  a long time.** b
1300: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
1310: 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70   threads give up
1320: 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20   and allows the 
1330: 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64  other to proceed
1340: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
1350: 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f  thread trying to
1360: 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65   get the reserve
1370: 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20  d lock gives up 
1380: 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69  quickly.** (if i
1390: 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  t never invokes 
13a0: 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63  its busy callbac
13b0: 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  k) then the cont
13c0: 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ention will be.*
13d0: 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b  * resolved quick
13e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ly..*/.#ifndef S
13f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1400: 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  VED_LOCK.# defin
1410: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
1420: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65  SERVED_LOCK 0.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1440: 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61   macro rounds va
1450: 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20  lues up so that 
1460: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1470: 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a  an address it.**
1480: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1490: 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20  o be an address 
14a0: 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20  that is aligned 
14b0: 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  to an 8-byte bou
14c0: 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ndary..*/.#defin
14d0: 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  e FORCE_ALIGNMEN
14e0: 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26  T(X)   (((X)+7)&
14f0: 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ~7)../*.** Each 
1500: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
1510: 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73  of a page begins
1520: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1530: 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54  ing header..** T
1540: 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e  his header is on
1550: 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ly visible to th
1560: 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e  is pager module.
1570: 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20    The client.** 
1580: 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20  code that calls 
1590: 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20  pager sees only 
15a0: 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  the data that fo
15b0: 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72  llows the header
15c0: 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63  ..**.** Client c
15d0: 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ode should call 
15e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15f0: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1600: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1610: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1620: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1630: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1640: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  e sqlite3pager_w
1650: 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c  rite().** is cal
1660: 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  led, the origina
1670: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
1680: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
16a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48   journal and PgH
16b0: 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  dr.inJournal and
16c0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
16d0: 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c  are set.  Later,
16e0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75   once.** the jou
16f0: 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61  rnal page has ma
1700: 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64  de it onto the d
1710: 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48  isk surface, PgH
1720: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69  dr.needSync.** i
1730: 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20  s cleared.  The 
1740: 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61  modified page ca
1750: 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20  nnot be written 
1760: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
1770: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1780: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  se file until th
1790: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20  e journal pages 
17a0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
17b0: 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a  to disk and the.
17c0: 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  ** PgHdr.needSyn
17d0: 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  c has been clear
17e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67  ed..**.** The Pg
17f0: 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69  Hdr.dirty flag i
1800: 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74  s set when sqlit
1810: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1820: 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a  is called and.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69   is cleared agai
1840: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  n when the page 
1850: 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74  content is writt
1860: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f  en back to the o
1870: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70  ase file..*/.typ
1890: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
18a0: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
18b0: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
18c0: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
18f0: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
1900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1930: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1940: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1950: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
1960: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
1970: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
1980: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
1990: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19a0: 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72  xtFree, *pPrevFr
19b0: 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74  ee;  /* Freelist
19c0: 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20   of pages where 
19d0: 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  nRef==0 */.  PgH
19e0: 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20  dr *pNextAll;   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
1a10: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
1a20: 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76  NextStmt, *pPrev
1a30: 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  Stmt;  /* List o
1a40: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
1a50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a60: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1a70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1a80: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1a90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1aa0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1ab0: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68  /* TRUE if in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
1af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1b00: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b20: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
1b30: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
1b40: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
1b50: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1b70: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1b80: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1b90: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1bb0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1bc0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1be0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
1bf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1c10: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
1c20: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1c30: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1c40: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
1c50: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
1c60: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66  gHdr.pgno */.#if
1c70: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c80: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1c90: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1ca0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1cc0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cd0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1ce0: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1cf0: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d10: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d20: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d30: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d40: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d60: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d70: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1d80: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1d90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1da0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1db0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1dc0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1dd0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1df0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e00: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e10: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e20: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e30: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e40: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e50: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e60: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e70: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1e80: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1e90: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ea0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1eb0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ec0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ed0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1ee0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1ef0: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f00: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f10: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f20: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f30: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f40: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f50: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f60: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f70: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1f80: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1f90: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fa0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fb0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fc0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1fd0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1fe0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1ff0: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2000: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2010: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2030: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2040: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2050: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2060: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2080: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
2090: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
20a0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
20b0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
20c0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
20d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
20e0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
20f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2100: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2110: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2120: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2130: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2140: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2150: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2160: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2170: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2180: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2190: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
21a0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
21b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
21c0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
21d0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
21e0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
21f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2200: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2210: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2220: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2230: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2240: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2250: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2260: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
2270: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2280: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
2290: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
22a0: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
22b0: 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  ber. This macro 
22c0: 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73  looks a little s
22d0: 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61  illy, but is eva
22e0: 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d  luated.** at com
22f0: 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72  pile-time, not r
2300: 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73  un-time (at leas
2310: 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20 69  t for gcc this i
2320: 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66  s true)..*/.#def
2330: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c  ine N_PG_HASH (\
2340: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30  .  (MAX_PAGES>10
2350: 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d  24)?2048: \.  (M
2360: 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30  AX_PAGES>512)?10
2370: 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  24: \.  (MAX_PAG
2380: 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20  ES>256)?512: \. 
2390: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29   (MAX_PAGES>128)
23a0: 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?256: \.  (MAX_P
23b0: 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20  AGES>64)?128:64 
23c0: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  \.)../*.** Hash 
23d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
23e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
23f0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2400: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2410: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2420: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2430: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2440: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2460: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2470: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2480: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2490: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
24a0: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
24b0: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
24c0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
24d0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
24e0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
24f0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
2500: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
2510: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
2520: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2530: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2540: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2550: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2560: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2570: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2580: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2590: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
25a0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
25b0: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
25c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
25d0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
25e0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
25f0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
2600: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
2610: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
2620: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2630: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2640: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2650: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2660: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2670: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2680: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2690: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
26a0: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
26b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
26c0: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
26d0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
26e0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
26f0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2700: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2710: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2720: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2730: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2760: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2770: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2780: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
27b0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
27f0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2800: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2810: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2820: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2830: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2840: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2850: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2860: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2880: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2890: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
28a0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
28b0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
28c0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
28d0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
28e0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
28f0: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2910: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2920: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2930: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2940: 0a 20 20 75 38 20 65 72 72 43 6f 64 65 3b 20 20  .  u8 errCode;  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2970: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2980: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29a0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
29b0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
29c0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
29d0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
29e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29f0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2a00: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2a10: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2a20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a30: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2a40: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2a50: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2a60: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2a70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a80: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2a90: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2aa0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2ab0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2ac0: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
2ad0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
2ae0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
2af0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2b00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b10: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2b20: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2b30: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2b40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b50: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2b60: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2b70: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 64   jrnl */.  int d
2b80: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ba0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2bb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2bc0: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2bd0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2be0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2bf0: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2c00: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c20: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2c30: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2c40: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2c50: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c90: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
2ca0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
2cb0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2cc0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2cd0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2ce0: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2cf0: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d10: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2d20: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2d30: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d50: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
2d60: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
2d70: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d80: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2db0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2dc0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2de0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2df0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2e00: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65  /.  int nMaxPage
2e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e20: 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d 61  /* High water ma
2e30: 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20  rk of nPage */. 
2e40: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2e70: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2e80: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2e90: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2ec0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2ed0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  in cache */.  u8
2ee0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
2ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2f00: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2f10: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f20: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
2f30: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f50: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f60: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
2f80: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2f90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2fa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2fc0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2ff0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3010: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
3020: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
3030: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
3040: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3070: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
3080: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
3090: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
30b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
30c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
30d0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
30e0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
30f0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
3100: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
3110: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
3120: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
3130: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
3140: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
3150: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
3160: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
3170: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
3180: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
3190: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
31a0: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
31d0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
31e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
31f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
3200: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
3210: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3220: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3230: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
3240: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
3250: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3270: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3290: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
32a0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
32b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
32c0: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
32e0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
32f0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3300: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3310: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3330: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
3340: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
3350: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3360: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3370: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3380: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3390: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
33a0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
33b0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
33c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
33d0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
33e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33f0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3400: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3410: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3420: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3430: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
3440: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3460: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3470: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3480: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3490: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
34a0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
34b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
34c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
34d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
34e0: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
34f0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
3500: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
3510: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
3520: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
3530: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3540: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3550: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3560: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3570: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3590: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
35a0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67 48  Codec() */.  PgH
35b0: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
35c0: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
35d0: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
35e0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
35f0: 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  dr */.#ifdef SQL
3600: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3610: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3620: 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ager *pNext;    
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3640: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
3650: 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65  ers in this thre
3660: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ad */.#endif.};.
3670: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
3680: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
3690: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
36a0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76  the variable giv
36b0: 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67  en in.** the arg
36c0: 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20  ument.*/.#ifdef 
36d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65  SQLITE_TEST.# de
36e0: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
36f0: 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  x++.#else.# d
3700: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3710: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
3720: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3730: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3740: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3750: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3760: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3770: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3780: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3790: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
37a0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
37b0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
37c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37d0: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
37e0: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
37f0: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3800: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3810: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3820: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3830: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
3840: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3850: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3860: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3870: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3880: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3890: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
38a0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
38b0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
38c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
38d0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
38e0: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
38f0: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3900: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3910: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3920: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3930: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3940: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3950: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3960: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3970: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3980: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3990: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
39a0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
39b0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
39c0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
39d0: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
39e0: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
39f0: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
3a00: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
3a10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
3a20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
3a30: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
3a40: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
3a50: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
3a60: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
3a70: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
3a80: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3a90: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
3aa0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
3ab0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
3ac0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
3ad0: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
3ae0: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
3af0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
3b00: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
3b10: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
3b20: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
3b30: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
3b40: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
3b50: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
3b60: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
3b70: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
3b80: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
3b90: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
3ba0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
3bb0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
3bc0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
3bd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
3be0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
3bf0: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
3c00: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
3c10: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
3c20: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
3c30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3c40: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3c50: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
3c60: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3c70: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3c80: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
3c90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
3ca0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3cb0: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
3cc0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
3cd0: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
3ce0: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
3cf0: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
3d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3d10: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3d30: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
3d40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
3d50: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
3d60: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
3d70: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
3d80: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
3d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
3da0: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
3db0: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
3dc0: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
3dd0: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
3de0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
3df0: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
3e00: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
3e10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
3e20: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
3e30: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
3e40: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
3e50: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
3e60: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
3e70: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
3e80: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
3e90: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
3ea0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3ec0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
3ed0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
3ee0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
3ef0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
3f00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
3f10: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
3f20: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
3f30: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
3f40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3f50: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f60: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3f70: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
3f80: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
3f90: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
3fa0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  ** The default s
3fb0: 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65  ize of a disk se
3fc0: 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ctor.*/.#define 
3fd0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
3fe0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  E 512../*.** Pag
3ff0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4000: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4010: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4020: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4030: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4040: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4050: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4060: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4070: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4080: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4090: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
40a0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
40b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40c0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40d0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40f0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4100: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4110: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4120: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4130: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4140: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4150: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4160: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4170: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4180: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4190: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
41a0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41b0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
41c0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41d0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41e0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4200: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4210: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4220: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4230: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4240: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4250: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4260: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4280: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
4290: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
42a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
42b0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
42c0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
42d0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
42e0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
42f0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4300: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4310: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4320: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4330: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4340: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
4350: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
4360: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4370: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4380: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4390: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
43a0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
43b0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
43c0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
43d0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
43e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
43f0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4410: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4420: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4430: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4440: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4450: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4460: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4470: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4480: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4490: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
44a0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
44b0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
44c0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
44d0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
44e0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
44f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4500: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4510: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4530: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4540: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4550: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4560: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4580: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
4590: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
45a0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
45b0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
45c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
45d0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
45e0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
45f0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4600: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4610: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4620: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4630: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4640: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4650: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4660: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4670: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4680: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4690: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
46a0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
46b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
46c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
46d0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
46e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
46f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4700: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4710: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4720: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4730: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4740: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4750: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4760: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
4770: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
4780: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
4790: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
47a0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
47c0: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
47d0: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
47e0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
47f0: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4800: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4810: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4820: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4830: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4840: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
4850: 65 74 29 7b 0a 20 20 63 68 61 72 20 2a 61 63 3b  et){.  char *ac;
4860: 0a 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a  .  ac = &((char*
4870: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4880: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 70 75  ))[offset];.  pu
4890: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
48d0: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
48e0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
48f0: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
4900: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
4910: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
4920: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
4930: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
4940: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
4950: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
4960: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
4970: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
4980: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
4990: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
49a0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
49b0: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
49c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
49d0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
49e0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
49f0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
4a00: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4a10: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4a20: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4a30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4a40: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4a50: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4a60: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4a70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4a80: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4aa0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4ab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ac0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4ae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4af0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4b10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
4b20: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c  SQLITE_PROTOCOL,
4b30: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
4b40: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
4b50: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
4b60: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4b70: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
4b80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
4b90: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
4ba0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
4bb0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4bc0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
4bd0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 61 73 73  , int rc){.  ass
4be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4bf0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4c00: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4c10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4c20: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4c30: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4c40: 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f  .    rc==SQLITE_
4c50: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 3d  IOERR ||.    rc=
4c60: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
4c70: 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  ||.    rc==SQLIT
4c80: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4c90: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4ca0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
4cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4cd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4ce0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4cf0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4d00: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4d10: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4d20: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4d30: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
4d40: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
4d50: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4d60: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
4d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
4d80: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
4d90: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
4da0: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
4db0: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
4dc0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
4dd0: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
4de0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
4e00: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
4e10: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
4e20: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
4e30: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4e40: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
4e50: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
4e60: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
4e70: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
4e80: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
4e90: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
4ea0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
4eb0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
4ec0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
4ed0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
4ee0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
4ef0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
4f00: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
4f10: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
4f20: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
4f30: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
4f40: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
4f50: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
4f60: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
4f70: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
4f80: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
4f90: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
4fa0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
4fb0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
4fc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
4fd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
4fe0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
4ff0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5000: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5010: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5020: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5040: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
5050: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
5060: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
5070: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
5080: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5090: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
50a0: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
50b0: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
50c0: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
50d0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
50e0: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
50f0: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5100: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5110: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5130: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
5140: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
5150: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
5160: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
5170: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
5180: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
5190: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
51a0: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
51b0: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
51c0: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
51d0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
51e0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
51f0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5200: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5210: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5220: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5230: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
5240: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5250: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
5260: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5270: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5290: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
52a0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
52b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
52c0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
52d0: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
52e0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
52f0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5300: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5310: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5320: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5330: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5350: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5360: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5370: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
5380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5390: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
53a0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
53b0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
53c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
53d0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
53e0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
53f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5410: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5420: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5430: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
5440: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
5450: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5460: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5480: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
5490: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
54a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
54b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
54c0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
54d0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
54e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
54f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5500: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5510: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5520: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5530: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5540: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
5550: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
5560: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
5570: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5580: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5590: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
55a0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
55b0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
55c0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
55d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
55e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
55f0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5600: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5610: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5620: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5630: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5640: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5650: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5660: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5670: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5680: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5690: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
56a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
56b0: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
56c0: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
56d0: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
56e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
56f0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5700: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5710: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5720: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5730: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5740: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5750: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5760: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5770: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5780: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5790: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
57a0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
57b0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
57c0: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
57d0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
57e0: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
57f0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5860: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5870: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5880: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5890: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
58a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
58b0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
58c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
58d0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
58e0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
58f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5900: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5910: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5930: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5940: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5950: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5960: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5970: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5980: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5990: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
59a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
59b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
59c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
59d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
59e0: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
59f0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5a00: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5a10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5a20: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5a40: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5a50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5a60: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5a70: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5a80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5a90: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5aa0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5ab0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5ac0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5ae0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5af0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5b00: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5b10: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5b20: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5b30: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5b40: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5b50: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5b60: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5b70: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5b80: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5b90: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5ba0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5bb0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5bc0: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5bd0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5be0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5bf0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5c00: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5c10: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5c20: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5c30: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5c40: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5c50: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5c60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5c70: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5c80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5c90: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
5ca0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5cb0: 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63  )+16];..  int rc
5cc0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5cd0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5ce0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5cf0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5d00: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5d10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5d20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5d30: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5d40: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5d50: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5d60: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5d70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d80: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5d90: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5da0: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5db0: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5dc0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5dd0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5df0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5e00: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5e10: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5e20: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5e30: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5e40: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5e50: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5e60: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5e70: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5e80: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5e90: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5ea0: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5eb0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
5ec0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
5ed0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
5ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
5ef0: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
5f00: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
5f10: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
5f20: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
5f30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
5f40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5f50: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
5f60: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
5f70: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
5f80: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
5f90: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
5fa0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
5fb0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
5fc0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5fd0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
5fe0: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
5ff0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6000: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6010: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
6020: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
6030: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
6040: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
6050: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6070: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
6080: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
6090: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
60a0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
60b0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
60c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
60d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
60e0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
60f0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6100: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6110: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6120: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
6130: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
6140: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
6150: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
6160: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
6170: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
6180: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
6190: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
61a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
61b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
61c0: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
61d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
61e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
61f0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
6200: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6210: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
6220: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6230: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
6240: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6250: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  (pPager->jfd, "\
6260: 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  000", 1);.    }.
6270: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
6290: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
62a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
62b0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
62c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
62d0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
62e0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
62f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
6300: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
6310: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
6320: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
6330: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
6340: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
6350: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
6360: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
6370: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6380: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
6390: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
63a0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
63b0: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
63c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
63d0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
63e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
63f0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
6400: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
6410: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
6420: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
6430: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
6440: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
6450: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
6460: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
6470: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
6480: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6490: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
64a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
64b0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
64c0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
64d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64e0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
64f0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6500: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6510: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6520: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6530: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6540: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6550: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
6560: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
6570: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
6580: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6590: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
65a0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
65b0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
65c0: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
65d0: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
65e0: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
65f0: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6600: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6610: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6620: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6630: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6640: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  eader */..  rc =
6650: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6660: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
6670: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6680: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6690: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
66a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
66b0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
66c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
66e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
66f0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
6700: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
6710: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
6720: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6730: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6740: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6750: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6760: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6780: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6790: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
67a0: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
67b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
67c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
67d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
67e0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
67f0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
6800: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6820: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6830: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
6840: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6850: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6860: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
6870: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
6880: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
6890: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
68a0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
68b0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
68c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
68d0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
68e0: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
68f0: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
6900: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6910: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
6920: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
6930: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6940: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
6950: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
6960: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
6970: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
6980: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
6990: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
69a0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
69b0: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
69c0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
69d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
69e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
69f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a00: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6a10: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6a30: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
6a40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a50: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
6a60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6a70: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
6a80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6a90: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
6aa0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
6ab0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
6ac0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6ad0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
6ae0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
6af0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
6b00: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
6b10: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
6b20: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
6b30: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
6b40: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
6b50: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
6b60: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
6b70: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
6b80: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
6b90: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
6ba0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
6bb0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
6bd0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
6be0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
6bf0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6c00: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
6c10: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
6c20: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
6c30: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
6c40: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
6c50: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
6c70: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
6c80: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
6c90: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
6ca0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
6cb0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
6cc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
6cd0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
6ce0: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
6cf0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
6d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
6d10: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
6d20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
6d30: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
6d40: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
6d50: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
6d60: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
6d70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
6d80: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
6d90: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
6da0: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
6db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6dc0: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
6dd0: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
6de0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
6e10: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
6e20: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
6e30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6e40: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
6e50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
6e60: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
6e70: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6e80: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
6e90: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
6ea0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
6eb0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
6ec0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
6ed0: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
6ee0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
6ef0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
6f00: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6f10: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
6f20: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
6f30: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
6f40: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
6f50: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6f60: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
6f70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6f80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
6f90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6fa0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6fb0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6fc0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6fd0: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
6fe0: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
6ff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7000: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7020: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7030: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
7040: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7050: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7060: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
7070: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
7080: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
7090: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
70a0: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
70b0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
70c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
70d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
70e0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
70f0: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
7100: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7110: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
7120: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
7130: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
7140: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7150: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
7160: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
7170: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
7180: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
7190: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
71a0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
71b0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
71c0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
71d0: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
71e0: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
71f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7200: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
7210: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
7220: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
7230: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7240: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7250: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7260: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7270: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7280: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7290: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
72a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
72b0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
72c0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
72d0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
72e0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
72f0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7300: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
7310: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7320: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7330: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
7340: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7350: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
7360: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
7370: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
7380: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7390: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
73a0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
73b0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
73c0: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
73d0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
73e0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
73f0: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
7400: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
7410: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
7420: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
7430: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
7440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7450: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
7460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7470: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7480: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
7490: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
74a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
74b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
74c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
74d0: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
74e0: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
74f0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
7500: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7510: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
7520: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7530: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7540: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7550: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
7560: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
7570: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7580: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
7590: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
75a0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
75b0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
75c0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
75d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
75e0: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
75f0: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
7600: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
7610: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7620: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7630: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
7640: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7650: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
7660: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
7670: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
7680: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
7690: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
76a0: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
76b0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
76c0: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
76d0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
76e0: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
76f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
7700: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
7710: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
7720: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
7730: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7740: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7750: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7760: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7770: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7780: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7790: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
77a0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
77b0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
77c0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
77d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
77e0: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
77f0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
7800: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
7810: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
7820: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
7830: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
7840: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
7850: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
7860: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7870: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7880: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
7890: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
78a0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
78b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
78c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
78d0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
78e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
78f0: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
7900: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
7910: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
7920: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
7930: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
7940: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
7950: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
7960: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
7970: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7980: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7990: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
79a0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
79b0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
79c0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
79d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
79e0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
79f0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7a00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7a10: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
7a20: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73  >nRef = 0;.  ass
7a30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
7a40: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d  rnalOpen==0 );.}
7a50: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7a60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7a70: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7a80: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7a90: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
7aa0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
7ab0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
7ac0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
7ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
7ae0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
7af0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7b00: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7b10: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7b20: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7b30: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7b40: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7b50: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7b60: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7b80: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
7b90: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
7ba0: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
7bb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
7bc0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
7bd0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
7be0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
7bf0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
7c00: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7c10: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
7c20: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
7c30: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7c40: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
7c50: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
7c60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7c70: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
7c80: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
7c90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7ca0: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
7cb0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
7cc0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7cd0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
7ce0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7cf0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
7d00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
7d10: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
7d20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d30: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
7d40: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7d50: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
7d60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
7d70: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
7d80: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7d90: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
7da0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
7db0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
7dc0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
7dd0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7de0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
7df0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7e00: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
7e10: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
7e20: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7e30: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7e40: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7e50: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7e60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7e70: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
7e80: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
7e90: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
7ea0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
7eb0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7ec0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
7ed0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
7ee0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7f00: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
7f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f20: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
7f30: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
7f40: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
7f50: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
7f60: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7f70: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
7f80: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7f90: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
7fa0: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
7fb0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
7fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
7fd0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75  ster = 0;.  retu
7fe0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7ff0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
8000: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8010: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8020: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8030: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8040: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8050: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8060: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8070: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8080: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8090: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
80a0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
80b0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
80c0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
80d0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
80e0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
80f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8100: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8110: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8120: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8130: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8140: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8150: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8160: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8170: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8180: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8190: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
81a0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
81b0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
81c0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
81d0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
81e0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
81f0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8200: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8210: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8220: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8230: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8240: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8250: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8260: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8270: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8280: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8290: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
82a0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
82b0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
82c0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
82d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
82e0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
82f0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
8300: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
8310: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
8320: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
8330: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
8340: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
8350: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
8360: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
8370: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
8380: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
8390: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
83a0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
83b0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
83c0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
83d0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
83e0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
83f0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
8400: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8410: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8420: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e  , Pgno pgno, con
8430: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8440: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8450: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8460: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8470: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8480: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8490: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
84a0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
84b0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
84c0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
84d0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
84e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
84f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
8500: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
8510: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
8520: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
8530: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
8540: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
8550: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
8560: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
8570: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
8580: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
8590: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
85a0: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
85b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
85c0: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
85d0: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
85e0: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
85f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
8600: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
8610: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
8620: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
8630: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a   int useCksum){.
8640: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
8650: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
8660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
8670: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
8680: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
8690: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86b0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
86c0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
86d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
86e0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
8700: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
8710: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
8720: 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49  .  u8 aData[SQLI
8730: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8740: 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ];  /* Temp stor
8750: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
8760: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
8770: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
8780: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
8790: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
87a0: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
87b0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
87c0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
87d0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
87e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
87f0: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
8800: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
8810: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
8820: 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  ;...  rc = read3
8830: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
8840: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8850: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8860: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
8870: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61  e3OsRead(jfd, &a
8880: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
8890: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
88a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
88b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
88c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
88d0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
88e0: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
88f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
8900: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
8910: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
8920: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
8930: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
8940: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
8950: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
8960: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8970: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
8980: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
8990: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
89a0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
89b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
89c0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
89d0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
89e0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
89f0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
8a00: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
8a10: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
8a20: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
8a30: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
8a40: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
8a50: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
8a60: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
8a70: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
8a80: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
8a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
8ab0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
8ac0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
8ad0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
8ae0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8af0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
8b00: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
8b10: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
8b20: 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  um(pPager, pgno,
8b30: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
8b40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8b50: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
8b60: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
8b70: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
8b80: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
8b90: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
8ba0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
8bb0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
8bc0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
8bd0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
8be0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
8bf0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
8c00: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
8c10: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
8c20: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
8c30: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
8c40: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
8c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8c60: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
8c70: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
8c80: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
8c90: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
8ca0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
8cb0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
8cc0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
8cd0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
8ce0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
8cf0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8d00: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
8d10: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
8d20: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
8d30: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
8d40: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
8d50: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
8d60: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
8d70: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
8d80: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
8d90: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
8da0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8db0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
8dc0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
8dd0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
8de0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
8df0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
8e00: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
8e10: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
8e20: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
8e30: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
8e40: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8e50: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
8e60: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
8e70: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
8e80: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
8e90: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
8ea0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
8eb0: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
8ec0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
8ed0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
8ee0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
8ef0: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
8f00: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
8f10: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
8f20: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
8f30: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
8f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
8f50: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
8f60: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
8f70: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
8f80: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
8f90: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
8fa0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
8fb0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
8fc0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
8fd0: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
8fe0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
8ff0: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
9000: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9010: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9020: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9030: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9040: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9050: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9060: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
9070: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
9080: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
9090: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
90a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
90b0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
90c0: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
90d0: 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42  .  TRACE3("PLAYB
90e0: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
90f0: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
9100: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9110: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9120: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9130: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9140: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9150: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9160: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
9170: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9180: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
9190: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
91a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
91b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
91c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
91d0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
91e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
91f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9200: 67 20 29 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  g ) pPg->dirty =
9210: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
9220: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
9230: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
9240: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
9250: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
9260: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
9270: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
9280: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
9290: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
92a0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
92b0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
92c0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
92d0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
92e0: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
92f0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
9300: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
9310: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
9320: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
9330: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
9340: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
9350: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
9360: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
9370: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
9380: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
9390: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
93a0: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
93b0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
93c0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
93d0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
93e0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
93f0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
9400: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9410: 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58  tor ){  /*** FIX
9420: 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69   ME:  Should thi
9430: 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a  s be xReinit? **
9440: 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
9450: 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
9460: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9470: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
9480: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
9490: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
94a0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
94b0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
94c0: 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43  #endif.    CODEC
94d0: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
94e0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
94f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9500: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
9510: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
9520: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
9530: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9540: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
9550: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
9560: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
9570: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9580: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
9590: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
95a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
95b0: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
95c0: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
95d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
95e0: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
95f0: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
9600: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  s..**.** The mas
9610: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9620: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
9630: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
9640: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
9650: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
9660: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
9670: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
9680: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
9690: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
96a0: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
96b0: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
96c0: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
96d0: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
96e0: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
96f0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
9700: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
9710: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
9720: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
9730: 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63  elmaster(const c
9740: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
9750: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
9760: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
9770: 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72    OsFile *master
9780: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d   = 0;.  char *zM
9790: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
97a0: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
97b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
97c0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
97d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
97e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
97f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9800: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
9810: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9820: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
9830: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
9840: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
9850: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
9860: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
9870: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
9880: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
9890: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
98a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
98b0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73  penReadOnly(zMas
98c0: 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20  ter, &master);. 
98d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
98e0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
98f0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
9900: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63  r_open = 1;.  rc
9910: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
9920: 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d  Size(master, &nM
9930: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9940: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9950: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9960: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
9970: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
9980: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
9990: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
99a0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
99b0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
99c0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
99d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
99e0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
99f0: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
9a00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
9a10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
9a20: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
9a30: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
9a40: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
9a50: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
9a60: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
9a70: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
9a80: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
9a90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9aa0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9ab0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9ac0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
9ad0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73  qlite3OsRead(mas
9ae0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
9af0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
9b00: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
9b10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
9b20: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9b30: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
9b40: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
9b50: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
9b60: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
9b70: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
9b80: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
9b90: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
9ba0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
9bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
9bc0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
9bd0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
9be0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9bf0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
9c00: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
9c10: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
9c20: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
9c30: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
9c40: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
9c50: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
9c60: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
9c70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
9c80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9c90: 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e     OsFile *journ
9ca0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
9cb0: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
9cc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
9cd0: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72  enReadOnly(zJour
9ce0: 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a  nal, &journal);.
9cf0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9d00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9d10: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9d20: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9d30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
9d40: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
9d50: 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a  rnal(journal, &z
9d60: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9d70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9d80: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9d90: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9da0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9db0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9dc0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9dd0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
9de0: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
9df0: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
9e00: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
9e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9e20: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
9e30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
9e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
9e50: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
9e60: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
9e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9e80: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
9e90: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9ea0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9eb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9ec0: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
9ed0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
9ee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
9ef0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9f00: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
9f10: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
9f20: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9f30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
9f40: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
9f50: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
9f60: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
9f70: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9f80: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
9f90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9fa0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
9fb0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
9fc0: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
9fd0: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
9fe0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
9ff0: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a000: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a010: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a020: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a030: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a040: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a050: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a060: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a070: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a080: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a090: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a0a0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a0b0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a0c0: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a0d0: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a0e0: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a0f0: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a100: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a110: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a120: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a130: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a140: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a150: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a160: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a170: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a180: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a190: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a1a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a1b0: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a1c0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a1d0: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a1e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a1f0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a200: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a210: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a230: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
a240: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a250: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
a260: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
a270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a280: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a290: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a2a0: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
a2b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
a2d0: 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70  E3("REFETCH %d p
a2e0: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
a2f0: 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
a300: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
a310: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
a320: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
a330: 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e  , zBuf, pPg->pgn
a340: 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  o, 2);.    }else
a350: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a  {.      memset(z
a360: 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Buf, 0, pPager->
a370: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a380: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
a390: 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ef==0 || memcmp(
a3a0: 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44  zBuf, PGHDR_TO_D
a3b0: 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
a3c0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
a3d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
a3e0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a3f0: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a400: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
a410: 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
a420: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
a430: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
a440: 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
a450: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a460: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
a480: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
a490: 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
a4a0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
a4b0: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
a4c0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65    }.    pPg->nee
a4d0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
a4e0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
a4f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
a500: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a510: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a520: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a530: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
a540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a550: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
a560: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
a570: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
a580: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
a590: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
a5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a5b0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
a5c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
a5d0: 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  t nPage){.  asse
a5e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
a5f0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
a600: 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  VE );.  return s
a610: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
a620: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
a630: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a640: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
a650: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
a660: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
a670: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
a680: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
a690: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
a6a0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
a6b0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
a6c0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
a6d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
a6e0: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
a6f0: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
a700: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
a710: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
a720: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
a730: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
a740: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a750: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
a760: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
a770: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
a780: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
a790: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
a7a0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
a7b0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
a7c0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
a7d0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
a7e0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
a7f0: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
a800: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
a810: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
a820: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
a830: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
a840: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
a850: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
a860: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
a870: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a880: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a890: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
a8a0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
a8b0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
a8c0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
a8d0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
a8e0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
a8f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a900: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a910: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
a920: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
a930: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
a940: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
a950: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
a960: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
a970: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
a980: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
a990: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
a9a0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
a9b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
a9c0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
a9d0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
a9e0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a9f0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
aa00: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
aa10: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
aa20: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
aa30: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
aa40: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
aa50: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
aa60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
aa70: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
aa80: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
aa90: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
aaa0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
aab0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
aac0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
aad0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
aae0: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
aaf0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
ab00: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
ab10: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
ab20: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
ab30: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
ab40: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
ab50: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
ab60: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
ab70: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
ab80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
ab90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
aba0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
abb0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
abc0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
abd0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
abe0: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
abf0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
ac00: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
ac10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
ac20: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
ac30: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
ac40: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
ac50: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
ac60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ac70: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
ac80: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
ac90: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
aca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
acb0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
acc0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
acd0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
ace0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
acf0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
ad00: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
ad10: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
ad20: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
ad30: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
ad40: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
ad50: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
ad60: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
ad70: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
ad80: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
ad90: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
ada0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
adb0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
adc0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
add0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
ade0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
adf0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
ae00: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
ae10: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
ae20: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
ae30: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
ae40: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
ae50: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
ae60: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
ae70: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
ae80: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
ae90: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
aea0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
aeb0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
aec0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
aed0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
aee0: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
aef0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
af00: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
af10: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
af20: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
af30: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
af40: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
af50: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
af60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
af70: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
af80: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
af90: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
afa0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
afb0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
afc0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
afd0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
afe0: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
aff0: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
b000: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
b010: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
b020: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
b030: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
b040: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
b050: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
b060: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
b070: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
b080: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
b090: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
b0a0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
b0b0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
b0c0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
b0d0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
b0e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b0f0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
b100: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b110: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
b120: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b130: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b140: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
b150: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b170: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
b180: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b190: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b1b0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b1c0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
b1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
b1e0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
b1f0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
b200: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
b230: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
b240: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
b250: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
b260: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
b270: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
b280: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
b290: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
b2a0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
b2b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
b2c0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
b2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b2e0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
b2f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
b300: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
b310: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
b320: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
b330: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
b340: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b350: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b360: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
b370: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
b380: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
b390: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
b3a0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
b3b0: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
b3c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b3d0: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
b3e0: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
b3f0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
b400: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
b410: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
b420: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
b430: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
b440: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
b450: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
b460: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
b470: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
b480: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
b490: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
b4a0: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
b4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
b4c0: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
b4d0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
b4e0: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
b4f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
b500: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
b510: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
b520: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
b530: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b540: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b550: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
b560: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
b570: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
b580: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b590: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
b5a0: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
b5b0: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
b5c0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b5d0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
b5e0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
b5f0: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
b600: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
b610: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
b620: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
b630: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
b640: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
b650: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
b660: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
b670: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
b680: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b690: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
b6a0: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
b6b0: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
b6c0: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
b6d0: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
b6e0: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
b6f0: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
b700: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
b710: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
b720: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
b730: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
b740: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b750: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
b760: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
b770: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b780: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
b790: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b7a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b7b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
b7c0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
b7d0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
b7e0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
b7f0: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
b800: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
b810: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
b820: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
b830: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
b840: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
b850: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
b860: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
b870: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
b880: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
b890: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
b8a0: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
b8b0: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
b8c0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
b8d0: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
b8e0: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
b8f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b900: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
b910: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b920: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b930: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
b940: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
b950: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
b960: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
b970: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
b980: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
b990: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b9a0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
b9b0: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
b9c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
b9d0: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
b9e0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
b9f0: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
ba00: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
ba10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ba20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ba30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ba40: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
ba50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ba60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ba70: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
ba80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ba90: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
baa0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
bab0: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
bac0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
bad0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
bae0: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
baf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bb00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
bb10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bb20: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
bb30: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
bb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
bb50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
bb60: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a  k(pPager->jfd, J
bb70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
bb80: 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69  ager)); */.    i
bb90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bba0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
bbb0: 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  back;.  .    /* 
bbc0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
bbd0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
bbe0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
bbf0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
bc00: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
bc10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
bc20: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
bc30: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
bc40: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
bc50: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
bc60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
bc70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bc80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
bc90: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
bca0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
bcb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
bcc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bcd0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
bce0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bcf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bd00: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bd10: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
bd20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bd30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
bd40: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
bd50: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
bd60: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
bd70: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
bd80: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
bd90: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
bda0: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
bdb0: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
bdc0: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
bdd0: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
bde0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
bdf0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
be00: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
be10: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67  LITE_OK );.  pag
be20: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
be30: 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c  pPager);..end_pl
be40: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
be50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
be60: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
be70: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
be80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
be90: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
bea0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
beb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
bec0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
bed0: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
bee0: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
bef0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
bf00: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
bf10: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
bf20: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
bf30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bf40: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
bf50: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
bf60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bf70: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
bf80: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
bf90: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
bfa0: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
bfb0: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
bfc0: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
bfd0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
bfe0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
bff0: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
c000: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
c010: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
c020: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c030: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c040: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c050: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c060: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
c070: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c080: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c090: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c0a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c0b0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
c0c0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
c0d0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c0e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c0f0: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
c100: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
c110: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
c120: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
c130: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
c140: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
c150: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c160: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
c170: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
c180: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
c190: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
c1a0: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
c1b0: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
c1c0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
c1d0: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
c1e0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
c1f0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
c200: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
c210: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
c220: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
c230: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
c240: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
c250: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
c260: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
c270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c280: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
c290: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
c2a0: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2c0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
c2d0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
c2e0: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
c2f0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
c300: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c310: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
c320: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c330: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c340: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c350: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
c360: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c370: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
c380: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
c390: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
c3a0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
c3b0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
c3c0: 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
c3d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c3f0: 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
c400: 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
c410: 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
c420: 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
c430: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
c440: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c450: 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69  written.  ** thi
c460: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
c470: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20  saction, or the 
c480: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c490: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
c4a0: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
c4b0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
c4c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
c4d0: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
c4e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
c4f0: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
c500: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
c510: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
c520: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
c530: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
c540: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
c550: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
c560: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
c570: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
c580: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
c590: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c5a0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
c5b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c5c0: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
c5d0: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
c5e0: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
c5f0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
c600: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
c610: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
c620: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
c630: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c640: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
c650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c660: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
c670: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c680: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
c690: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
c6a0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
c6b0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
c6c0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
c6d0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
c6e0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
c6f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c700: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
c710: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c720: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
c730: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
c740: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
c750: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
c760: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
c770: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
c780: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
c790: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
c7a0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
c7b0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
c7c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
c7d0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
c7e0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
c7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
c800: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
c810: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c820: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
c830: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
c840: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
c850: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
c860: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
c870: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
c880: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
c890: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
c8a0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c8b0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
c8c0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
c8d0: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
c8e0: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
c8f0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
c900: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
c910: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
c920: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
c930: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
c940: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
c950: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
c960: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
c970: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
c980: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c990: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
c9a0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c9b0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
c9c0: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
c9d0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
c9e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
c9f0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
ca00: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
ca10: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
ca20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca30: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
ca40: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
ca50: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
ca60: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
ca70: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
ca80: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ca90: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
caa0: 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74  tCksum;.  assert
cab0: 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ( JOURNAL_HDR_SZ
cac0: 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72  (pPager)<(pPager
cad0: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b  ->pageSize+8) );
cae0: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
caf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20  ->journalOff <= 
cb00: 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d  (hdrOff-(pPager-
cb10: 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b  >pageSize+8)) ){
cb20: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
cb30: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cb40: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
cb50: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
cb60: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
cb70: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
cb80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cb90: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
cba0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
cbb0: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
cbc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
cbd0: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63   ){.    u32 nRec
cbe0: 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  ;.    u32 dummy;
cbf0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
cc00: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
cc10: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75   szJ, &nRec, &du
cc20: 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
cc30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cc40: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
cc50: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
cc60: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
cc70: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
cc80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63    }.    if( nRec
cc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ==0 ){.      nRe
cca0: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
ccb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
ccc0: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
ccd0: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
cce0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
ccf0: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
cd00: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
cd10: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
cd20: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
cd30: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
cd40: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
cd50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
cd70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
cd80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
cd90: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cda0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
cdb0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cdc0: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
cdd0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
cde0: 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  k:.  if( rc!=SQL
cdf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ce00: 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
ce10: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 43 4f  Pager, SQLITE_CO
ce20: 52 52 55 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  RRUPT);.  }else{
ce30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
ce40: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
ce50: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
ce60: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
ce70: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
ce80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
ce90: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
cea0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
ceb0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
cec0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
ced0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
cee0: 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65  er_set_cachesize
cef0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
cf00: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
cf10: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
cf20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
cf30: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
cf40: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
cf50: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
cf60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
cf70: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
cf80: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cf90: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
cfa0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
cfb0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
cfc0: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
cfd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
cfe0: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
cff0: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
d000: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
d010: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
d020: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
d030: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
d040: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
d050: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
d060: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d080: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
d090: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
d0a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
d0b0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d0c0: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
d0d0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
d0e0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
d0f0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
d100: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
d110: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
d120: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
d130: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d140: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
d150: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
d160: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
d170: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
d180: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
d190: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
d1a0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
d1b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
d1d0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
d1e0: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
d1f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
d200: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d210: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
d220: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
d230: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
d240: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d250: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
d260: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
d270: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d280: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
d290: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
d2a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
d2b0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
d2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
d2e0: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
d2f0: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
d300: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
d310: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
d320: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
d330: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
d350: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
d360: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
d370: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
d380: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
d390: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
d3a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
d3b0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
d3c0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
d3d0: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
d3e0: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
d3f0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d400: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
d410: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
d420: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
d430: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
d440: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
d450: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
d460: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
d470: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d480: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
d490: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d4a0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
d4b0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
d4c0: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
d4d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
d4e0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
d4f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
d500: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d510: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
d520: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
d530: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
d540: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
d550: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d560: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
d570: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
d580: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
d590: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
d5a0: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
d5b0: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
d5c0: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
d5d0: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
d5e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
d5f0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
d600: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
d610: 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ly.  .*/.int sql
d620: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
d630: 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  unt = 0;../*.** 
d640: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
d650: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
d660: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
d670: 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a  le into zFile.**
d680: 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20   (zFile must be 
d690: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
d6a0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
d6b0: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
d6c0: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
d6d0: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
d6e0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
d6f0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
d700: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
d710: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
d720: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
d730: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
d740: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
d750: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
d760: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
d770: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
d780: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
d790: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
d7a0: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
d7b0: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
d7c0: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
d7d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
d7e0: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
d7f0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
d800: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
d810: 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  nly */.  do{.   
d820: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
d830: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
d840: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
d850: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d860: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
d870: 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69   pFd, 1);.  }whi
d880: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
d890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
d8a0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
d8b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d8c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
d8d0: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
d8e0: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
d8f0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
d900: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
d910: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
d920: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
d930: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
d940: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
d950: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
d960: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
d970: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
d980: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
d990: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
d9a0: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
d9b0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
d9c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
d9d0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
d9e0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
d9f0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
da00: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
da10: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
da20: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
da30: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
da40: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
da50: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
da60: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
da70: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
da80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
da90: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
daa0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
dab0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
dac0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
dad0: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
dae0: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
daf0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
db00: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
db10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
db20: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
db30: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
db40: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
db50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
db60: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
db70: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
db80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
db90: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
dba0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
dbb0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
dbc0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbe0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
dbf0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
dc00: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
dc10: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
dc30: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
dc40: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
dc50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
dc60: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  0;.  char *zFull
dc70: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
dc80: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
dc90: 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74  sFile *fd;.  int
dca0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dcb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
dcc0: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
dcd0: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
dce0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
dcf0: 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
dd00: 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
dd10: 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
dd20: 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
dd30: 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
dd40: 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
dd50: 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72  LOCK)!=0;.  char
dd60: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
dd70: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69  MPNAME_SIZE];.#i
dd80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
dd90: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
dda0: 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
ddb0: 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
ddc0: 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
ddd0: 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
dde0: 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
ddf0: 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
de00: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
de10: 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
de20: 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
de30: 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
de40: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
de50: 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
de60: 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
de70: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
de80: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
de90: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
dea0: 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
deb0: 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e  t. It would be n
dec0: 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20  ice to assert.  
ded0: 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61  ** that ThreadDa
dee0: 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e  ta.nAlloc is non
def0: 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20  -zero, but alas 
df00: 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74  this breaks test
df10: 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69   cases .  ** wri
df20: 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  tten to invoke t
df30: 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c  he pager directl
df40: 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  y..  */.  Thread
df50: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
df60: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
df80: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
df90: 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73   If malloc() has
dfa0: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20   already failed 
dfb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dfc0: 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e  MEM. Before even
dfd0: 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f  .  ** testing fo
dfe0: 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50  r this, set *ppP
dff0: 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20  ager to NULL so 
e000: 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73  the caller knows
e010: 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
e020: 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65  structure was ne
e030: 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a  ver allocated. .
e040: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20    */.  *ppPager 
e050: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
e060: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
e070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e080: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e090: 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30  .  memset(&fd, 0
e0a0: 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a  , sizeof(fd));..
e0b0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
e0c0: 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ger file and set
e0d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74   zFullPathname t
e0e0: 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f  o point at mallo
e0f0: 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f  c()ed .  ** memo
e100: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
e110: 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e  e complete filen
e120: 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64  ame (i.e. includ
e130: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
e140: 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  y)..  */.  if( z
e150: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
e160: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
e170: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e180: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
e190: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
e1a0: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
e1b0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
e1c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
e1d0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e1e0: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
e1f0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
e200: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
e210: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e220: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e230: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e240: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
e250: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
e260: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e270: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
e280: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
e290: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
e2a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
e2b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e2c0: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
e2d0: 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20  (zTemp, &fd);.  
e2e0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54    zFilename = zT
e2f0: 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61  emp;.    zFullPa
e300: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
e310: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
e320: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
e330: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e340: 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69   ){.      tempFi
e350: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
e360: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
e370: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e380: 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66  ture. As part of
e390: 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61   the same alloca
e3a0: 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20  tion, allocate. 
e3b0: 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68   ** space for th
e3c0: 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20  e full paths of 
e3d0: 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74  the file, direct
e3e0: 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ory and journal 
e3f0: 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69  .  ** (Pager.zFi
e400: 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44  lename, Pager.zD
e410: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67  irectory and Pag
e420: 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20  er.zJournal)..  
e430: 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61  */.  if( zFullPa
e440: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61  thname ){.    na
e450: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
e460: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e470: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
e480: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
e490: 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65  (*pPager) + name
e4a0: 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20  Len*3 + 30 );.  
e4b0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
e4c0: 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
e4d0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
e4e0: 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
e4f0: 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a  the memory .  **
e500: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e510: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72  FullPathname, fr
e520: 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
e530: 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
e540: 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e   the .  ** file.
e550: 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
e560: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
e570: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
e580: 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
e590: 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
e5a0: 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
e5b0: 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
e5c0: 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  || !zFullPathnam
e5d0: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
e5e0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
e5f0: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
e600: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e610: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e620: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
e630: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
e640: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
e650: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
e660: 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  c);.  }..  TRACE
e670: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
e680: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
e690: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
e6a0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
e6b0: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
e6c0: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
e6d0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e6e0: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
e6f0: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
e700: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
e710: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
e720: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
e730: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
e740: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
e750: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
e760: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
e770: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
e780: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e790: 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65  ..  for(i=nameLe
e7a0: 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  n; i>0 && pPager
e7b0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
e7c0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
e7d0: 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
e7e0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e7f0: 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79  1] = 0;.  strcpy
e800: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
e810: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
e820: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
e830: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e840: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
e850: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
e860: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
e870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
e880: 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72   fd;.  /* pPager
e890: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
e8a0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
e8b0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
e8c0: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
e8d0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
e8e0: 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
e8f0: 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
e900: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
e910: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
e920: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e930: 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
e940: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
e950: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
e960: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
e970: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
e980: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
e990: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
e9a0: 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ZE;.  /* pPager-
e9b0: 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
e9c0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
e9d0: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
e9e0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
e9f0: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  age = 0; */.  /*
ea00: 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
ea10: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
ea20: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
ea30: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
ea40: 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20  R_UNLOCK==0 );. 
ea50: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
ea60: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
ea70: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
ea80: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
ea90: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
eaa0: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
eab0: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
eac0: 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
ead0: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
eae0: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
eaf0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
eb00: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
eb10: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
eb20: 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
eb30: 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
eb40: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
eb50: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f  (pPager->noSync?
eb60: 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  0:1);.  /* pPage
eb70: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
eb80: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
eb90: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
eba0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
ebb0: 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
ebc0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
ebd0: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
ebe0: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
ebf0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
ec00: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
ec10: 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  IZE;.  /* pPager
ec20: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
ec30: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
ec40: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
ec50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
ec60: 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
ec70: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
ec80: 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
ec90: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
eca0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
ecb0: 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ager->pNext = pT
ecc0: 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54  sd->pPager;.  pT
ecd0: 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
ece0: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ger;.#endif.  re
ecf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ed00: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ed10: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
ed20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
ed30: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ed40: 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  _busyhandler(Pag
ed50: 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
ed60: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
ed70: 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
ed80: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
ed90: 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
edb0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
edc0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
edd0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
ede0: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
edf0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
ee00: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
ee10: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
ee20: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
ee30: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
ee40: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
ee50: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
ee60: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
ee70: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
ee80: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
ee90: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
eea0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
eeb0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
eec0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
eed0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
eee0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
eef0: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
ef00: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
ef10: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ef20: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
ef30: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
ef40: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
ef50: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
ef60: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
ef70: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
ef80: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
ef90: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
efa0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
efb0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
efc0: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
efd0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
efe0: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
eff0: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
f000: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
f010: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
f020: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
f030: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
f040: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
f050: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
f060: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
f070: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
f080: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
f090: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
f0a0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
f0b0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
f0c0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
f0d0: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
f0e0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
f0f0: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
f100: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
f110: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
f120: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
f130: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
f140: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
f150: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
f160: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
f170: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
f180: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
f190: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
f1a0: 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
f1b0: 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
f1c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f1d0: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
f1e0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
f1f0: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
f200: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
f210: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f220: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f230: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
f240: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
f250: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
f260: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
f270: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65  geSize;.  }.  re
f280: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
f290: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
f2a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
f2b0: 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
f2c0: 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
f2d0: 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
f2e0: 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
f2f0: 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
f300: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
f310: 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
f320: 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
f330: 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
f340: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
f350: 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
f360: 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
f370: 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
f380: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
f390: 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
f3a0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
f3b0: 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
f3c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
f3d0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
f3e0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f3f0: 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
f400: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
f410: 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
f420: 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63  aved_cnt;.void c
f430: 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69  lear_simulated_i
f440: 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c  o_error(){.  sql
f450: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
f460: 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69  t = 0;.}.void di
f470: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f480: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f490: 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
f4a0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f4b0: 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
f4c0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f4d0: 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
f4e0: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f4f0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
f500: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
f510: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
f520: 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
f530: 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61  se.# define clea
f540: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
f550: 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20  rror().# define 
f560: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
f570: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
f580: 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
f590: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f5a0: 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
f5b0: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f5c0: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
f5d0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
f5e0: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
f5f0: 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
f600: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
f610: 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
f620: 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
f630: 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
f640: 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
f650: 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
f660: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
f670: 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
f680: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
f690: 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
f6a0: 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
f6b0: 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
f6c0: 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
f6d0: 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
f6e0: 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
f6f0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
f700: 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
f710: 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
f720: 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
f730: 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
f740: 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
f750: 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
f760: 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
f770: 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
f780: 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  his)..*/.void sq
f790: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f  lite3pager_read_
f7a0: 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  fileheader(Pager
f7b0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
f7c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f7d0: 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74  pDest){.  memset
f7e0: 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
f7f0: 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
f800: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
f810: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
f820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
f830: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
f840: 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20   pDest, N);.    
f850: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
f860: 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  io_error();.  }.
f870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f880: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
f890: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
f8a0: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
f8b0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
f8c0: 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
f8d0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
f8e0: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
f8f0: 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
f900: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
f910: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
f920: 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
f930: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
f940: 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
f950: 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
f960: 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
f970: 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
f980: 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
f990: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
f9a0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
f9b0: 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
f9c0: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
f9d0: 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
f9e0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
f9f0: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
fa00: 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61  r){.  i64 n;.  a
fa10: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
fa20: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
fa30: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
fa40: 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
fa50: 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
fa60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
fa70: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
fa80: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
fa90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
faa0: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
fab0: 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  er, SQLITE_IOERR
fac0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fad0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
fae0: 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
faf0: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
fb00: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
fb10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
fb20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fb30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fb40: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
fb50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
fb60: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
fb70: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
fb80: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
fb90: 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
fba0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
fbb0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72      n++;.  }.  r
fbc0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
fbd0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
fbe0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
fbf0: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
fc00: 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  Pager*);.../*.**
fc10: 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
fc20: 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
fc30: 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
fc40: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
fc50: 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
fc60: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
fc70: 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
fc80: 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
fc90: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
fca0: 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
fcb0: 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
fcc0: 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
fcd0: 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
fce0: 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
fcf0: 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
fd00: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
fd10: 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
fd20: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
fd30: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
fd40: 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
fd50: 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
fd60: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
fd70: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  o==0 ){.    /* I
fd80: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
fd90: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  r is zero, then 
fda0: 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74  this page is not
fdb0: 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61   in any hash cha
fdc0: 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  in. */.    retur
fdd0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
fde0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
fdf0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
fe00: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
fe10: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
fe20: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
fe30: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
fe40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
fe50: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
fe60: 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67  pPg->pgno)]!=pPg
fe70: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
fe80: 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
fe90: 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
fea0: 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
feb0: 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68   int h = pager_h
fec0: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ash(pPg->pgno);.
fed0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fee0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50  er->aHash[h]==pP
fef0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
ff00: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
ff10: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
ff20: 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
ff30: 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
ff40: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
ff50: 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
ff60: 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
ff70: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
ff80: 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
ff90: 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
ffa0: 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
ffb0: 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
ffc0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
ffd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
ffe0: 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
fff0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
10000 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
10010 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
10020 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
10030 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
10040 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
10050 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
10060 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
10070 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10080 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
10090 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
100a0 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
100b0 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
100c0 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
100d0 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
100e0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
100f0 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
10100 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
10110 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
10120 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
10130 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
10140 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
10150 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
10160 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10180 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
10190 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
101a0 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
101b0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
101c0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
101d0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
101e0 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
101f0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
10200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
10220 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
10230 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
10240 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10250 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
10260 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
10270 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
10280 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
10290 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
102a0 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
102b0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
102c0 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Pg);.}..#ifndef 
102d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
102e0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RYDB./*.** This 
102f0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
10300 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69  to truncate an i
10310 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10320 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c  e.  Delete.** al
10330 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
10340 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  no is larger tha
10350 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
10360 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
10370 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e  nced..** Referen
10380 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
10390 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
103a0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
103b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
103c0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50  memoryTruncate(P
103d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
103e0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
103f0 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
10400 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
10410 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
10420 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
10430 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
10440 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
10450 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
10460 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
10470 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
10480 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
10490 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
104a0 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
104b0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
104c0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
104d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
104e0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
104f0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
10510 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
10520 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  All;.      unlin
10530 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
10540 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
10550 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
10560 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
10570 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
10580 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
10590 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
105a0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
105b0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
105c0 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
105d0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
105e0 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
105f0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
10600 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
10610 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
10620 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
10630 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
10640 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
10650 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
10660 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10670 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
10680 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
10690 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
106a0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
106b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
106c0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
106d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
106e0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
106f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  rc;.  assert( PA
10700 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
10710 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
10720 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
10730 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
10740 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10750 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
10760 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
10770 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10780 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
10790 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
107a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
107b0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
107c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
107d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
107e0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
107f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10800 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
10810 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
10820 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
10830 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
10840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10850 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10860 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
10870 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
10880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10890 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
108a0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
108b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
108c0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
108d0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
108e0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
108f0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
10900 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10910 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
10920 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
10930 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
10940 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
10950 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
10960 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10970 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
10980 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
10990 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
109a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
109b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
109c0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
109d0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
109e0 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
109f0 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
10a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10a10 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
10a20 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
10a30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10a40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10a50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10a60 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
10a70 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
10a80 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
10a90 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
10aa0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
10ab0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
10ac0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
10ad0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10af0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
10b00 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
10b10 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
10b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
10b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
10b40 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10b50 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
10b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10b70 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
10b80 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
10b90 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
10ba0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
10bb0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
10bc0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
10bd0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
10be0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10bf0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
10c00 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
10c10 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
10c20 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
10c30 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
10c40 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
10c50 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
10c60 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
10c70 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
10c80 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
10c90 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
10ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10cb0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
10cc0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
10cd0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
10ce0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
10cf0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
10d00 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10d10 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
10d20 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
10d30 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
10d40 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
10d50 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
10d60 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
10d70 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
10d80 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
10d90 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
10da0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
10db0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
10dc0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
10dd0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
10de0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10df0 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
10e00 78 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  xt;.#ifdef SQLIT
10e10 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
10e20 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
10e30 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
10e40 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
10e50 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
10e60 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
10e70 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
10e80 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
10e90 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
10ea0 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
10eb0 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
10ec0 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
10ed0 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
10ee0 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
10ef0 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
10f00 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
10f10 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
10f20 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
10f30 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
10f40 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
10f50 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
10f60 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
10f70 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ( pPager );.  as
10f80 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54  sert( pTsd && pT
10f90 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65  sd->nAlloc );.#e
10fa0 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
10fb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
10fc0 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
10fd0 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61  RESERVED:.    ca
10fe0 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a  se PAGER_SYNCED:
10ff0 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52   .    case PAGER
11000 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20  _EXCLUSIVE: {.  
11010 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65      /* We ignore
11020 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73 20 74   any IO errors t
11030 68 61 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67  hat occur during
11040 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   the rollback.  
11050 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
11060 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49 4f 20  . So disable IO 
11070 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e  error simulation
11080 20 73 6f 20 74 68 61 74 20 74 65 73 74 69 6e 67   so that testing
11090 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20  .      ** works 
110a0 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20 20 20  more easily..   
110b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 69 73 61     */.      disa
110c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
110d0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20  _errors();.     
110e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
110f0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11100 20 20 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d        enable_sim
11110 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11120 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4d  ();.      if( !M
11130 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
11140 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11150 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
11160 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
11170 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11180 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70  er->errCode || p
11190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
111a0 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
111b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
111c0 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
111d0 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
111e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
111f0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
11200 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
11210 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
11220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11230 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
11240 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
11250 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
11260 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
11270 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
11280 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
11290 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20  pNext){.#ifndef 
112a0 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d  NDEBUG.    if( M
112b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
112c0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
112d0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
112e0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
112f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
11300 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
11310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11320 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
11330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11340 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
11350 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11360 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
11370 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
11380 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
11390 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  }.  TRACE2("CLOS
113a0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
113b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73  (pPager));.  ass
113c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
113d0 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
113e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
113f0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
11400 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
11410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11420 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
11430 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11440 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
11450 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
11460 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
11470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11480 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
11490 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
114a0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
114b0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
114c0 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
114d0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
114e0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
114f0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
11500 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
11510 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11520 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
11530 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
11540 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
11550 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20   }.  */..#ifdef 
11560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
11570 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
11580 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
11590 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c  pager from the l
115a0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
115b0 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  gers starting at
115c0 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74   .  ** ThreadDat
115d0 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f  a.pPager if memo
115e0 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
115f0 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20   enabled..  */. 
11600 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73   if( pPager==pTs
11610 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  d->pPager ){.   
11620 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
11630 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
11640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65   }else{.    Page
11650 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72  r *pTmp;.    for
11660 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50  (pTmp = pTsd->pP
11670 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  ager; pTmp->pNex
11680 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d  t!=pPager; pTmp=
11690 70 54 6d 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  pTmp->pNext);.  
116a0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20    pTmp->pNext = 
116b0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
116c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
116d0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
116e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
116f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
11700 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
11710 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
11720 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
11730 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67  .Pgno sqlite3pag
11740 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f  er_pagenumber(vo
11750 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11760 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f  Hdr *p = DATA_TO
11770 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
11780 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
11790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
117a0 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
117b0 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
117c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
117d0 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
117e0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
117f0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
11800 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
11810 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
11820 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
11830 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
11840 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
11850 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
11860 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
11870 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
11880 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
11890 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
118a0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
118b0 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
118c0 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
118d0 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
118e0 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
118f0 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
11900 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
11910 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
11920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
11930 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
11940 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
11950 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
11960 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
11970 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
11980 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
11990 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
119a0 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
119b0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
119c0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
119d0 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
119e0 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
119f0 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
11a00 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
11a10 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
11a20 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
11a30 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
11a40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
11a50 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
11a60 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
11a70 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
11a80 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11aa0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
11ab0 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
11ac0 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
11ad0 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
11ae0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
11af0 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11b00 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11b10 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
11b20 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
11b30 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
11b40 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
11b50 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
11b60 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
11b70 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
11b80 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
11b90 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
11ba0 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
11bb0 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
11bc0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
11bd0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
11be0 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
11bf0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
11c00 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
11c10 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
11c20 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
11c30 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
11c40 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
11c50 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
11c60 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
11c70 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
11c80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
11c90 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
11ca0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
11cb0 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
11cc0 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
11cd0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11ce0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
11cf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11d00 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
11d10 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
11d20 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
11d30 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
11d40 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
11d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11d60 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
11d70 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
11d80 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
11d90 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
11da0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
11db0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
11dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
11dd0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
11de0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
11df0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
11e00 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
11e10 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
11e20 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
11e30 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
11e40 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
11e50 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
11e60 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
11e70 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
11e80 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
11e90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
11ea0 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
11eb0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
11ec0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
11ed0 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
11ee0 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
11ef0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
11f00 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
11f10 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
11f20 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
11f30 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
11f40 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
11f50 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
11f60 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
11f70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
11f80 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
11f90 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
11fa0 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
11fb0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
11fc0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
11fd0 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
11fe0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
11ff0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
12000 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
12010 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
12020 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
12030 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
12040 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
12050 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12060 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
12070 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
12080 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
12090 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
120a0 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
120b0 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
120c0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
120d0 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
120e0 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
120f0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
12100 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
12110 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
12120 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
12130 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
12140 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
12150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
12160 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
12170 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
12180 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
12190 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
121a0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
121b0 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
121c0 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
121d0 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
121e0 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
121f0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
12200 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
12210 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
12220 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
12230 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
12240 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
12250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12270 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
12280 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
12290 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
122a0 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
122b0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
122c0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
122d0 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
122e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
122f0 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
12300 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
12310 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
12320 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
12330 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
12340 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
12350 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
12360 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
12370 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
12380 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12390 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
123a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
123b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
123c0 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
123d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
123e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
123f0 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
12400 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12410 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
12440 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
12450 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
12460 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
12470 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
12480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12490 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
124a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
124b0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
124c0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
124d0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
124e0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
124f0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
12500 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
12510 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
12520 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
12530 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
12540 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
12550 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
12560 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
12570 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
12580 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
12590 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
125a0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
125b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
125c0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
125d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
125e0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
125f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12600 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
12610 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12620 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12630 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12640 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12670 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
12680 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
12690 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
126a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
126b0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
126c0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
126d0 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
126e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
126f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12700 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12710 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
12720 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
12730 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
12740 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12750 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12760 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
12770 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
12780 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
12790 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63 20  ger));.      rc 
127a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
127b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
127c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
127d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
127e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
127f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
12800 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
12810 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
12820 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
12830 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
12840 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
12850 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
12860 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
12870 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
12880 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
12890 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
128a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
128b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
128c0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
128d0 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  d = pPager->pFir
128e0 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  st;.  }..#ifndef
128f0 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
12900 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
12910 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
12920 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
12930 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
12940 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
12950 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
12960 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
12970 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
12980 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
12990 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
129a0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
129b0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
129c0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
129d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
129e0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
129f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12a00 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
12a10 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d  tSynced==pPager-
12a20 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  >pFirst );.  }.#
12a30 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
12a40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
12a50 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
12a60 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
12a70 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
12a80 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
12a90 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
12aa0 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
12ab0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12ac0 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
12ad0 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
12ae0 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
12af0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
12b00 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
12b10 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
12b20 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
12b30 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
12b40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
12b50 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
12b60 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
12b70 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
12b80 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
12b90 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
12ba0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
12bb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
12bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12bd0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
12be0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
12bf0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
12c00 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
12c10 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
12c20 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
12c30 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
12c40 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
12c50 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
12c60 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
12c70 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
12c80 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
12c90 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
12ca0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
12cb0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
12cc0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
12cd0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
12ce0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
12cf0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
12d00 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
12d10 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
12d20 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
12d30 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
12d40 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
12d50 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
12d60 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
12d70 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
12d80 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
12d90 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
12da0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
12db0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
12dc0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
12dd0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
12de0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
12df0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
12e00 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
12e10 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
12e20 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
12e30 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
12e40 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12e50 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
12e60 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
12e70 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
12e80 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
12e90 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
12ea0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
12eb0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
12ec0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
12ed0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
12ee0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
12ef0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
12f00 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
12f10 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
12f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12f40 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ..  while( pList
12f50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12f60 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
12f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12f80 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
12f90 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d  d, (pList->pgno-
12fa0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
12fb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
12fc0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12fd0 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  c;.    /* If the
12fe0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
12ff0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
13000 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
13010 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
13020 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
13030 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
13040 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65 72  ans sqlite3pager
13050 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  _truncate() was 
13060 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
13070 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
13080 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
13090 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
130a0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
130b0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
130c0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
130d0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
130e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
130f0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
13100 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  ize ){.      COD
13110 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
13120 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
13130 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
13140 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
13150 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
13160 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13170 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
13180 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o);.      rc = s
13190 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
131a0 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
131b0 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 0a  TO_DATA(pList),.
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
131e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
131f0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
13200 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
13210 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
13220 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
13230 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
13240 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
13250 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
13260 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
13270 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
13280 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
13290 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
132a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
132b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
132c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
132d0 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
132e0 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
132f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
13300 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
13310 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
13320 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
13330 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
13340 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
13350 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
13360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13370 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
13380 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
13390 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
133a0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
133b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
133c0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
133d0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
133e0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
133f0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
13400 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
13410 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
13420 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
13430 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
13440 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
13450 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
13460 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
13470 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
13480 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
13490 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
134a0 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
134b0 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
134c0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
134d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
134e0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
134f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13500 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
13510 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
13520 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
13530 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
13540 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
13550 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
13560 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
13570 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
13580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13590 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
135a0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
135b0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
135c0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
135d0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
135e0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
135f0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
13600 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
13610 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
13620 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
13630 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
13640 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
13650 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13660 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
13670 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
13680 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
13690 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
136a0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  al) ) return 0;.
136b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
136c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
136d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
136e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
136f0 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
13700 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
13710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
13720 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13730 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
13740 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
13750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
13760 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
13770 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
13780 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
13790 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
137a0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
137b0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
137c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
137d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
137e0 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
137f0 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
13800 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
13810 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
13820 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13830 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
13840 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
13850 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
13860 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13870 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
13880 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
13890 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
138a0 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
138b0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
138c0 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
138d0 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
138e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
138f0 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
13900 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13910 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
13920 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
13930 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13940 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
13950 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
13960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
13970 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
13980 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
13990 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
139a0 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
139b0 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
139c0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
139d0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
139e0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
139f0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
13a00 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
13a10 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
13a20 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
13a30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
13a40 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
13a50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
13a60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13a70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13a80 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
13a90 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
13aa0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
13ab0 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
13ac0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13ad0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
13ae0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
13af0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
13b00 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
13b10 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
13b20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
13b30 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
13b40 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
13b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
13b60 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
13b70 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
13b80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13b90 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
13ba0 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
13bb0 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
13bc0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
13bd0 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
13be0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
13bf0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
13c00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13c10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
13c20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
13c30 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
13c40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
13c50 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
13c80 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
13c90 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
13ca0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
13cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13cc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
13cd0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
13ce0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
13cf0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
13d00 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
13d10 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
13d20 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
13d30 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13d40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
13d50 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
13d60 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
13d70 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
13d80 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
13d90 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20   pPg );.    if( 
13da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
13dd0 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
13de0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
13df0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
13e00 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
13e10 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
13e20 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
13e30 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
13e40 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
13e50 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
13e60 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
13e70 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
13e80 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
13e90 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
13ea0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
13eb0 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
13ec0 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
13ed0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
13ee0 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
13ef0 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
13f00 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
13f10 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
13f20 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
13f30 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
13f40 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
13f50 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
13f60 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
13f70 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
13f80 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
13f90 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
13fa0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
13fb0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
13fc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
13fd0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
13fe0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  {.    pPager->al
13ff0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
14000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
14010 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
14020 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
14030 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
14040 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
14050 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
14060 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
14070 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70  ->nOvfl);..  *pp
14080 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
14090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
140b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
140c0 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
140d0 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
140e0 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
140f0 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
14100 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
14110 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
14120 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
14130 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
14140 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14150 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46  d may be sqliteF
14160 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
14170 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
14180 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
14190 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
141a0 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
141b0 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
141c0 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
141d0 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61   returns. A nega
141e0 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e  tive value for n
141f0 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65  Req means.** fre
14200 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
14210 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   as possible. Th
14220 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
14230 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
14240 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
14250 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
14260 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14270 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
14280 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e  RY_MANAGEMENT.in
14290 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
142a0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e  elease_memory(in
142b0 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74  t nReq){.  const
142c0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
142d0 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
142e0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
142f0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20  );.  Pager *p;. 
14300 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
14310 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
14320 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
14330 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
14340 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
14350 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
14360 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
14370 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
14380 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
14390 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
143a0 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
143b0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
143c0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
143d0 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
143e0 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
143f0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
14400 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
14410 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
14420 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
14430 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
14440 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
14450 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
14460 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
14470 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
14480 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
14490 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
144a0 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
144b0 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
144c0 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
144d0 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
144e0 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
144f0 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
14500 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
14510 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
14520 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
14530 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
14540 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
14550 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
14560 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
14570 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
14580 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
14590 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
145a0 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
145b0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
145c0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
145d0 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
145e0 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70   for(p=pTsdro->p
145f0 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65  Pager; p && (nRe
14600 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
14610 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65  <nReq); p=p->pNe
14620 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
14630 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
14640 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   rc;..      /* F
14650 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
14660 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
14670 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
14680 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
14690 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
146a0 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
146b0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
146c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
146d0 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
146e0 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
146f0 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
14700 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
14710 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c  pager_recycle(p,
14720 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
14730 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
14740 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
14750 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
14760 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
14770 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
14780 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
14790 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
147a0 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
147b0 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
147c0 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
147d0 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
147e0 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
147f0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
14800 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
14810 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
14820 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
14830 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
14840 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
14850 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
14860 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
14870 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
14880 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
14890 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
148a0 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
148b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
148c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
148d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
148e0 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
148f0 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
14900 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
14910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
14920 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  g==p->pAll ){.  
14930 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c           p->pAll
14940 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
14950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14960 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
14970 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54  pTmp=p->pAll; pT
14980 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
14990 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
149a0 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20 20  extAll );.      
149b0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
149c0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
149d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
149e0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
149f0 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69  += sqliteAllocSi
14a00 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ze(pPg);.       
14a10 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
14a20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
14a50 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
14a60 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
14a70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14a80 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
14a90 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
14aa0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
14ab0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
14ac0 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
14ad0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  e .        ** ca
14ae0 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
14af0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
14b00 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
14b10 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
14b20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65          ** The e
14b30 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
14b40 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
14b50 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
14b60 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
14b70 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
14b80 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
14b90 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
14ba0 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
14bb0 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20  ccured..        
14bc0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
14bd0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  t( rc==SQLITE_IO
14be0 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
14bf0 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
14c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
14c10 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
14c20 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
14c30 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29  ger_error(p, rc)
14c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52    }..  return nR
14c60 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
14c70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
14c80 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
14c90 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  MENT */../*.** A
14ca0 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
14cb0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
14cc0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
14cd0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
14ce0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
14cf0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
14d00 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
14d10 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
14d20 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
14d30 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
14d40 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
14d50 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
14d60 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
14d70 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
14d80 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
14d90 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
14da0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
14db0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
14dc0 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
14dd0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
14de0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
14df0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
14e00 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
14e10 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
14e20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
14e30 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
14e40 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
14e50 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
14e60 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
14e70 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
14e80 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
14e90 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
14ea0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
14eb0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
14ec0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
14ed0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
14ee0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14ef0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
14f00 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
14f10 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
14f20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
14f30 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
14f40 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
14f50 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
14f60 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
14f70 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
14f80 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
14f90 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
14fa0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
14fb0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
14fc0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
14fd0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
14fe0 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
14ff0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
15000 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
15010 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
15020 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
15030 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
15040 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
15050 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
15060 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
15070 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
15080 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
15090 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
150a0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
150b0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
150c0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
150d0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
150e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
150f0 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  3pager_get(Pager
15100 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
15110 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
15120 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
15130 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
15140 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
15150 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
15160 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
15170 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
15180 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
15190 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
151a0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
151b0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
151c0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
151d0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
151e0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
151f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
15200 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15210 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15220 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
15230 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
15240 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
15250 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
15260 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
15270 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
15280 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
15290 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
152a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
152b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
152c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
152d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
152e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
152f0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
15300 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
15310 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
15320 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
15330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15340 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
15350 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
15360 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20  EMDB ){.    if( 
15370 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
15380 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
15390 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
153a0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
153b0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
153c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
153d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
153e0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
153f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15410 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
15420 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
15430 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
15440 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
15450 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
15460 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
15470 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
15480 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
15490 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
154a0 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
154b0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
154c0 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
154d0 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
154e0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
154f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15500 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
15510 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
15520 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
15530 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
15540 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
15550 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
15560 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
15570 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
15580 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
15590 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
155a0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
155b0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
155c0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
155d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
155e0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
155f0 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
15600 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
15610 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
15620 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
15630 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
15640 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
15650 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
15660 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
15670 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
15680 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
15690 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
156a0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
156b0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
156c0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
156d0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
156e0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
156f0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
15700 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
15710 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15720 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
15730 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
15740 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
15750 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
15760 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
15770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15790 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
157a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
157b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
157c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
157d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
157e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
157f0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15800 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
15810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
15820 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
15830 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
15840 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
15850 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
15860 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
15870 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
15880 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
15890 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
158a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
158b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
158c0 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
158d0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
158e0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
158f0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
15900 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
15910 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
15920 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
15930 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
15940 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
15950 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
15960 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
15970 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
15980 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
15990 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
159a0 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
159b0 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
159c0 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
159d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
159e0 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
159f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15a00 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
15a10 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
15a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
15a40 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
15a50 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
15a60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
15a70 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
15a80 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
15a90 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
15aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15ac0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
15ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
15ae0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
15af0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15b00 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
15b10 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15b20 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
15b30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
15b40 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  dr = 0;..       
15b50 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
15b60 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
15b70 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
15b80 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
15b90 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
15ba0 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
15bb0 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
15bc0 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
15bd0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
15be0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66  ager);.       if
15bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15c00 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
15c10 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
15c20 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
15c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
15c40 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
15c50 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
15c60 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
15c70 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
15c80 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
15c90 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
15ca0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
15cb0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
15cc0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
15cd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15ce0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
15cf0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
15d00 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
15d10 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
15d20 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
15d30 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
15d40 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45     int h;.    TE
15d50 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
15d60 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20  nMiss);.    if( 
15d70 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
15d80 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
15d90 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
15da0 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  0 || MEMDB ){.  
15db0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
15dc0 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
15dd0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
15de0 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
15df0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
15e00 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
15e30 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
15e40 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
15e70 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
15e80 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
15e90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
15ea0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15ec0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
15ed0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
15ee0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
15ef0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
15f00 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
15f10 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
15f20 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
15f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15f40 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
15f50 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
15f60 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
15f70 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
15f80 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
15f90 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
15fa0 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
15fb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
15fc0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
15fd0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
15fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15ff0 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
16000 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
16010 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
16020 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  MaxPage++;.     
16030 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
16040 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
16050 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
16060 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69  , &pPg);.      i
16070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16090 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
160a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
160b0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
160c0 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20 20  (pPg) ;.    }.  
160d0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
160e0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
160f0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
16100 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
16110 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
16120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16130 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
16140 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
16150 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
16160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
16170 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
16180 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
16190 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
161a0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
161b0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
161c0 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
161d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
161e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
161f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
16200 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
16210 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
16220 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16230 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
16240 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
16250 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
16260 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
16270 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
16280 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16290 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
162a0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
162b0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
162c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
162d0 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
162e0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
162f0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
16300 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
16310 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
16320 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
16330 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
16340 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
16350 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
16360 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
16370 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
16380 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
16390 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
163a0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
163b0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
163c0 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
163d0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
163e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
163f0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16400 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
16410 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16420 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
16430 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
16440 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
16450 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
16460 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
16470 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16480 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
16490 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
164a0 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
164b0 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
164c0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
164d0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65  rrCode;.      re
164e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
164f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61     if( sqlite3pa
16500 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
16510 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20  ager)<(int)pgno 
16520 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16530 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16540 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
16550 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  ageSize);.    }e
16560 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
16570 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
16580 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20   MEMDB==0 );.   
16590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
165a0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
165b0 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
165c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
165d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
165e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
165f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16600 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
16610 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
16620 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20  TA(pPg),.       
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
16650 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
16660 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  }.      TRACE3("
16670 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
16680 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
16690 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
166a0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
166b0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
166c0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
166d0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
166e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
166f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
16700 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
16710 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
16720 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
16730 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
16740 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
16750 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
16760 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
16770 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
16780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
16790 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
167a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
167b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
167c0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
167d0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
167e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
167f0 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74     clear_simulat
16800 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20  ed_io_error();. 
16810 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
16820 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16830 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
16840 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
16850 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
16860 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e  .        TEST_IN
16870 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16890 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
168a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
168b0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
168c0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
168d0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
168e0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
168f0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
16900 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
16910 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f  he. */.    TEST_
16920 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
16930 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66  t);.    page_ref
16940 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
16950 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Page = PGHDR_TO_
16960 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74  DATA(pPg);.  ret
16970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16980 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
16990 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
169a0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
169b0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
169c0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
169d0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
169e0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
169f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
16a00 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
16a10 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16a20 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
16a30 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
16a40 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20  ger_get().  The 
16a50 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
16a60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
16a70 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61  ** and sqlite3pa
16a80 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
16a90 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
16aa0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
16ab0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
16ac0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
16ad0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16ae0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
16af0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
16b00 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
16b10 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16b20 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
16b30 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
16b40 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
16b50 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
16b60 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50  e3pager_lookup(P
16b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
16b80 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
16b90 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
16ba0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
16bb0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
16bc0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
16bd0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
16be0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
16bf0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
16c00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16c10 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
16c20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
16c30 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
16c40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
16c50 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
16c60 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
16c70 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
16c80 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
16c90 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
16ca0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
16cb0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
16cc0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
16cd0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
16ce0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
16cf0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
16d00 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
16d10 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
16d20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
16d30 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
16d40 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
16d50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
16d60 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
16d70 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
16d80 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
16d90 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
16da0 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
16db0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
16dc0 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
16dd0 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
16de0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16df0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
16e00 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
16e10 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
16e20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
16e30 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
16e40 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
16e50 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
16e60 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
16e70 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
16e80 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
16e90 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
16ea0 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
16eb0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
16ec0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
16ed0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
16ee0 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
16ef0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
16f00 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
16f10 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
16f20 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
16f30 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
16f40 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
16f50 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
16f60 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
16f70 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
16f80 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
16f90 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
16fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
16fb0 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
16fc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
16fd0 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
16fe0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
16ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
17000 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
17010 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
17020 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
17030 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
17040 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
17050 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
17060 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17070 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
17080 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
17090 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
170a0 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
170b0 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
170c0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
170d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
170e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
170f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
17100 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
17110 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17120 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
17130 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  DB ){.      page
17140 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17170 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
17180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
17190 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
171a0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
171b0 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
171c0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
171d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
171e0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
171f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
17200 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
17210 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17220 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
17230 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17240 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
17250 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
17260 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
17270 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
17280 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
17290 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
172a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
172b0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
172c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
172d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
172e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
172f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17300 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
17310 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17320 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
17330 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
17340 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17350 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
17360 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
17370 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
17380 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
17390 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
173a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
173b0 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
173c0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
173d0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
173e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
173f0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
17400 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
17410 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
17420 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
17430 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
17440 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
17480 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
17490 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
174a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
174b0 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
174c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
174d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
174e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
174f0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
17500 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73  journal;.  }.  s
17510 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
17520 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
17530 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
17540 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53  c);.  sqlite3OsS
17550 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
17560 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  r->fd, pPager->f
17570 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
17580 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
17590 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ry(pPager->jfd, 
175a0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
175b0 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ry);.  pPager->j
175c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
175d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
175e0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
175f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17600 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17610 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
17620 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
17630 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
17640 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
17650 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
17660 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
17670 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
17680 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
17690 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
176a0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
176b0 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
176c0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
176d0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
176e0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
176f0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
17700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17710 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
17720 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
17730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
17740 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
17750 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
17760 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
17770 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
17780 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
17790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
177a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
177b0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
177c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61    return rc;..fa
177d0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
177e0 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72  rnal:.  sqliteFr
177f0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
17800 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
17810 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
17820 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17830 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
17840 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
17850 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
17860 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  e, then we will 
17870 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74  not be closing t
17880 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
17890 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20  file. So delete 
178a0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
178b0 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73   we may have jus
178c0 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72  t created. Other
178d0 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  wise,.    ** the
178e0 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74   system will get
178f0 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61   confused, we ha
17900 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  ve a read-lock o
17910 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61  n the file and a
17920 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f  .    ** mysterio
17930 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  us journal has a
17940 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 66  ppeared in the f
17950 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a  ilesystem..    *
17960 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  /.    sqlite3OsD
17970 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
17980 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  ournal);.  }else
17990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  {.    sqlite3OsU
179a0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
179b0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
179c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
179d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
179e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
179f0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
17a00 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
17a10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
17a20 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
17a30 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
17a40 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
17a50 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
17a60 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
17a70 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
17a80 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
17a90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
17aa0 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
17ab0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
17ac0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
17ad0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
17ae0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
17af0 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
17b00 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
17b10 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
17b20 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
17b30 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
17b40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
17b50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
17b60 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
17b70 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
17b80 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
17b90 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
17ba0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
17bb0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
17bc0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
17bd0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
17be0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
17bf0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
17c00 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
17c10 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
17c20 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
17c30 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
17c40 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
17c50 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
17c60 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
17c70 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
17c80 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
17c90 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
17cb0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
17cc0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
17cd0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
17ce0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
17cf0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
17d00 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
17d10 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
17d20 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
17d30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
17d40 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
17d50 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
17d60 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
17d70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
17d80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
17d90 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
17da0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
17db0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
17dc0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17dd0 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
17de0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
17df0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
17e00 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
17e10 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
17e20 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
17e30 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
17e40 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
17e50 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
17e60 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
17e70 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
17e80 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
17e90 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
17ea0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
17eb0 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  in(void *pData, 
17ec0 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
17ed0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
17ee0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
17ef0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
17f00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
17f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17f20 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
17f30 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
17f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17f50 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
17f60 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
17f70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17f80 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
17f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17fa0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
17fb0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
17fc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17fd0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17fe0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
17ff0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18000 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
18010 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
18020 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18030 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
18040 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
18050 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
18060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18070 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18080 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
18090 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
180a0 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
180b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
180c0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
180d0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
180e0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
180f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18130 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
18140 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
18150 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54 52        TRACE2("TR
18160 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
18170 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
18190 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
181a0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
181b0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
181c0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
181d0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18200 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
18210 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
18220 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
18230 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
18240 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
18250 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
18260 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
18270 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
18280 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
18290 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
182a0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
182b0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
182c0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
182d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
182e0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
182f0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
18300 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
18310 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
18320 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
18330 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
18340 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
18350 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
18360 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
18370 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
18380 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
18390 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
183a0 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
183b0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
183c0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
183d0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
183e0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
183f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
18400 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
18410 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
18420 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
18430 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
18440 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
18450 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
18460 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
18470 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
18480 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
18490 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
184a0 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
184b0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
184c0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
184d0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
184e0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
184f0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
18500 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
18510 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
18520 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
18530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18540 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
18550 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
18560 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
18570 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
18580 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18590 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
185a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
185b0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
185c0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
185d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
185e0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
185f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
18600 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
18610 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
18620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18630 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
18640 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
18650 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
18660 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
18670 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
18680 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
18690 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
186a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
186b0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
186c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
186d0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
186e0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
186f0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
18700 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
18710 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
18720 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
18730 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
18740 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
18750 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
18760 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
18770 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
18780 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
18790 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
187a0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
187b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
187c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
187d0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
187e0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
187f0 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
18800 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
18810 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
18820 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18830 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
18840 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
18850 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
18860 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
18870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18880 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
18890 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
188a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
188b0 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20  in(pData, 0);.  
188c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
188d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
188e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
188f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18900 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
18910 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
18920 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
18930 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
18940 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
18950 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
18960 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
18970 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
18980 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18990 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
189a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
189b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
189c0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
189d0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
189e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
189f0 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
18a00 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
18a10 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
18a20 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
18a30 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
18a40 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
18a50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18a60 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
18a70 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
18a80 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
18a90 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
18aa0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
18ab0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
18ac0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
18ad0 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
18ae0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
18af0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
18b00 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
18b10 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
18b20 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
18b30 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
18b40 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
18b50 0a 20 20 20 20 20 20 20 20 75 33 32 20 73 61 76  .        u32 sav
18b60 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
18b70 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
18b80 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
18b90 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
18ba0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
18bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
18bc0 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
18bd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
18be0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
18bf0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
18c00 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
18c10 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
18c20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
18c30 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  rig = sqliteMall
18c40 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
18c50 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
18c60 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
18c70 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
18c80 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
18c90 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
18ca0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
18cb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18cc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18ce0 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
18cf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
18d00 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
18d10 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
18d20 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
18d30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
18d40 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
18d50 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
18d60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
18d70 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
18d80 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
18d90 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
18da0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18db0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
18dc0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18dd0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43  ) );.          C
18de0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
18df0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
18e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
18e10 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
18e20 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
18e30 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  no, pData);.    
18e40 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
18e50 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
18e60 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
18e70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
18e80 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70  e32bits(cksum, p
18e90 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
18ea0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
18eb0 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
18ec0 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
18ed0 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
18ee0 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
18ef0 2c 20 2d 34 29 3b 0a 0a 20 20 20 20 20 20 20 20  , -4);..        
18f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18f10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
18f20 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74  d, &((char*)pDat
18f30 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20  a)[-4], szPg);. 
18f40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
18f50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
18f60 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54  zPg;.          T
18f70 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE4("JOURNAL %
18f80 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
18f90 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
18fb0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18fc0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
18fd0 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
18fe0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
18ff0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
19010 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
19020 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
19030 72 29 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  r) = saved;...  
19040 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
19050 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
19060 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19070 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
19080 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
19090 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
190a0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
190b0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
190c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
190d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
190e0 5f 4f 4b 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  _OK ){.#if 0.   
190f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19100 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
19110 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
19120 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
19130 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19140 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
19150 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51  error(pPager, SQ
19160 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 20 20  LITE_FULL);.    
19170 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
19180 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
19190 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
191a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
191b0 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
191c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
191d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
191e0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
191f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19200 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
19210 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
19220 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19230 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19240 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
19250 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
19260 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
19270 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
19280 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
19290 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
192a0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
192b0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
192c0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
192d0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
192e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
192f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
19300 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
19310 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
19320 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19330 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
19340 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  nc;.        TRAC
19350 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
19360 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
19370 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19380 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19390 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
193a0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
193b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
193c0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
193d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
193e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
193f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
19400 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19410 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
19420 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
19430 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
19440 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
19450 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
19460 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
19470 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
19480 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
19490 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
194a0 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
194b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
194c0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
194d0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
194e0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
194f0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
19500 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
19510 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
19520 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
19530 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
19540 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
19550 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
19560 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
19570 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
19580 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19590 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
195a0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
195b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
195c0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
195d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
195e0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
195f0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
19600 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
19610 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19620 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
19630 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
19640 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
19650 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
19660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
19670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
19680 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
19690 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
196a0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
196b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
196c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
196d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
196e0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
196f0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19700 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19710 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19720 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
19730 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  se{.        stor
19740 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
19750 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
19760 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
19770 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
19780 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
19790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
197a0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
197b0 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  d,((char*)pData)
197c0 2d 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -4,.            
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
197f0 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
19800 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
19810 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
19820 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19830 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
19840 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
19850 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19860 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
19870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19890 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
198a0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
198b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
198c0 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   !pPager->errCod
198d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
198e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
198f0 67 65 72 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ger, SQLITE_FULL
19900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19910 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19920 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
19930 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
19940 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
19950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19960 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
19970 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19980 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
19990 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
199a0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
199b0 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  }.      page_add
199c0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
199d0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
199e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
199f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
19a00 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
19a10 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
19a20 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
19a30 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
19a40 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
19a50 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  gno;.    if( !ME
19a60 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
19a70 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
19a80 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
19a90 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
19aa0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
19ab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19ac0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19ad0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
19ae0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
19af0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
19b00 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
19b10 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
19b20 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20  3pager_write(). 
19b30 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19b40 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
19b50 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
19b60 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
19b70 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
19b80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
19b90 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76  er_iswriteable(v
19ba0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
19bb0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
19bc0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
19bd0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
19be0 64 69 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65  dirty;.}..#ifnde
19bf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
19c00 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  CUUM./*.** Repla
19c10 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
19c20 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
19c30 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
19c40 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
19c50 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
19c60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
19c70 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67  er_overwrite(Pag
19c80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19c90 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
19ca0 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  ta){.  void *pPa
19cb0 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ge;.  int rc;.. 
19cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19cd0 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
19ce0 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
19cf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19d00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
19d10 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
19d20 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
19d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19d40 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
19d50 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61  Page, pData, pPa
19d60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19d70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19d80 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
19d90 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
19da0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
19db0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
19dc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
19dd0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
19de0 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
19df0 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
19e00 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
19e10 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22  n on page "pgno"
19e20 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
19e30 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
19e40 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
19e50 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
19e60 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
19e70 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
19e80 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
19e90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
19ea0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
19eb0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
19ec0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
19ed0 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
19ee0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
19ef0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
19f00 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
19f10 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
19f20 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
19f30 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
19f40 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
19f50 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
19f60 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
19f70 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  rollback() below
19f80 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
19f90 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
19fa0 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
19fb0 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
19fc0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
19fd0 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
19fe0 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
19ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1a000 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
1a010 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1a020 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
1a030 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1a040 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
1a050 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
1a060 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1a070 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1a080 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1a090 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1a0a0 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1a0b0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1a0c0 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1a0d0 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1a0e0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1a0f0 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1a100 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1a110 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1a120 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1a130 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1a140 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1a150 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1a160 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1a170 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1a180 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1a190 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1a1a0 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1a1b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a1c0 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1a1d0 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
1a1e0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
1a1f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
1a200 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
1a210 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
1a220 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
1a230 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
1a240 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
1a250 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1a260 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
1a270 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
1a280 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1a290 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69  e3pager_dont_wri
1a2a0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1a2b0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1a2c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1a2d0 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  f( MEMDB ) retur
1a2e0 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  n;..  pPg = page
1a2f0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1a300 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61   pgno);.  pPg->a
1a310 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1a320 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20  1;.  if( pPg && 
1a330 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70  pPg->dirty && !p
1a340 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a350 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1a360 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1a370 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1a380 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a390 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1a3a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1a3b0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1a3c0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1a3d0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a3e0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1a3f0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1a400 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1a410 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1a420 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1a430 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1a440 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1a450 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1a460 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1a470 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1a480 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1a490 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1a4a0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1a4b0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1a4c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1a4d0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1a4e0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1a4f0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1a500 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1a510 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1a520 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1a530 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1a540 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1a550 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1a560 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1a570 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1a580 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1a590 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1a5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
1a5b0 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1a5c0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1a5d0 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  ", pgno, PAGERID
1a5e0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1a5f0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1a600 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1a610 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1a620 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1a630 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1a640 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1a650 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a660 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1a670 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1a680 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1a690 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1a6a0 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1a6b0 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1a6c0 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1a6d0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1a6e0 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1a6f0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1a700 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1a710 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1a720 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1a730 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1a740 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a750 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
1a760 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
1a770 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1a780 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1a790 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
1a7a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1a7b0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
1a7c0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1a7d0 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
1a7e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a7f0 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
1a800 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1a810 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
1a820 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1a830 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
1a840 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
1a850 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1a860 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1a870 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1a880 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1a890 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1a8a0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
1a8b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a8c0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1a8d0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1a8e0 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
1a8f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1a900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a910 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1a920 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1a930 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1a940 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1a950 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
1a960 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1a970 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
1a980 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1a990 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1a9a0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1a9b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a9c0 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ));.  }.  if( pP
1a9d0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1a9e0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
1a9f0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1aa00 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1aa10 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1aa20 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1aa30 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1aa40 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1aa50 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
1aa60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1aa70 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1aa80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1aa90 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1aaa0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1aab0 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
1aac0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1aad0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ;.  }.}...#ifnde
1aae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
1aaf0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65  MORYDB./*.** Cle
1ab00 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62  ar a PgHistory b
1ab10 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lock.*/.static v
1ab20 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79  oid clearHistory
1ab30 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73  (PgHistory *pHis
1ab40 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t){.  sqliteFree
1ab50 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
1ab60 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1ab70 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
1ab80 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
1ab90 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1aba0 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
1abb0 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
1abc0 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
1abd0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
1abe0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1abf0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
1ac00 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
1ac10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1ac20 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
1ac30 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
1ac40 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
1ac50 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
1ac60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ac70 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
1ac80 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
1ac90 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
1aca0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1acb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
1acc0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1acd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1ace0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1acf0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1ad00 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
1ad10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ad20 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
1ad30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1ad40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ad50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ad60 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1ad70 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
1ad80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1ad90 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1ada0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1adb0 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
1adc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1add0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
1ade0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
1adf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ae00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1ae10 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
1ae20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1ae30 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1ae40 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
1ae50 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1ae60 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1ae70 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
1ae80 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  Pg ){.      clea
1ae90 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
1aea0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1aeb0 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  er));.      pPg-
1aec0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1aed0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1aee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1aef0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1af00 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
1af10 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1af20 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1af30 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
1af40 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
1af50 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
1af60 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1af70 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1af80 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
1af90 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1afa0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1afb0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1afc0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
1afd0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1afe0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1aff0 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
1b000 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b010 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
1b020 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b030 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1b040 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b050 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1b060 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
1b070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b080 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1b090 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b  dirtyCache==0 ){
1b0a0 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72  .    /* Exit ear
1b0b0 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e  ly (without doin
1b0c0 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75  g the time-consu
1b0d0 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79  ming sqlite3OsSy
1b0e0 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20  nc() calls).    
1b0f0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65  ** if there have
1b100 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
1b110 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b120 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
1b130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1b140 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
1b150 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1b160 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1b170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1b180 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
1b190 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1b1a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1b1b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1b1c0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b1d0 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30  r_sync(pPager, 0
1b1e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1b1f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b200 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
1b210 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
1b220 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1b230 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1b240 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
1b260 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1b270 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1b280 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
1b290 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1b2a0 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
1b2b0 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t:.  sqlite3page
1b2c0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
1b2d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1b2e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1b2f0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
1b300 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
1b310 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
1b320 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
1b330 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
1b340 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
1b350 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
1b360 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
1b370 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
1b380 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
1b390 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b3a0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
1b3b0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
1b3c0 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
1b3d0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
1b3e0 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
1b3f0 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
1b400 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
1b410 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
1b420 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
1b430 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
1b440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b450 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
1b460 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
1b470 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
1b480 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
1b490 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
1b4a0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
1b4b0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
1b4c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
1b4d0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
1b4e0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
1b4f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1b500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1b510 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
1b520 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1b530 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
1b540 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1b550 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b560 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1b570 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1b580 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1b590 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1b5a0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1b5b0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1b5c0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1b5d0 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1b5e0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1b5f0 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1b600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1b610 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1b620 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1b630 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1b640 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b650 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1b660 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b670 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1b680 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1b690 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1b6a0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1b6b0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1b6c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1b6d0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1b6e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1b6f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1b700 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1b710 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b720 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
1b730 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
1b740 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
1b750 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1b760 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1b770 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52  else{.        TR
1b780 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
1b790 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
1b7a0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1b7b0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1b7c0 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
1b7d0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
1b7e0 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
1b7f0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
1b800 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1b810 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
1b820 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
1b830 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
1b840 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
1b850 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
1b860 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
1b870 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1b880 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b890 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1b8a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1b8b0 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70      .    }.    p
1b8c0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1b8d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b8e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
1b8f0 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
1b900 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1b910 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b920 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1b930 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1b940 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1b950 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1b960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b970 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
1b980 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
1b990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b9a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1b9b0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b9c0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b9d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b9e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b9f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1ba00 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1ba10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1ba20 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1ba30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ba40 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
1ba50 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
1ba60 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1ba70 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1ba80 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1ba90 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1baa0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1bab0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1bac0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1bad0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
1bae0 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
1baf0 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  er);.    rc2 = p
1bb00 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1bb10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1bb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bb30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
1bb40 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
1bb50 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bb60 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1bb70 29 3b 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69  );.  }.#if 0.  i
1bb80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bb90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1bba0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bbb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1bbc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1bbd0 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
1bbe0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
1bbf0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
1bc00 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
1bc10 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
1bc20 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
1bc30 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
1bc40 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
1bc50 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
1bc60 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
1bc70 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
1bc80 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1bc90 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1bca0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1bcb0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
1bcc0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
1bcd0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
1bce0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1bcf0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1bd00 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
1bd10 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
1bd20 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
1bd30 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
1bd40 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1bd50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
1bd60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bd70 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1bd80 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1bd90 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1bda0 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
1bdb0 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
1bdc0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1bdd0 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1bde0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1bdf0 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1be00 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1be10 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1be20 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1be30 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1be40 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1be50 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1be60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 23  ager->errCode;.#
1be70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1be80 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  T.  a[6] = pPage
1be90 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
1bea0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
1beb0 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
1bec0 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20  ->nOvfl;.  a[9] 
1bed0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
1bee0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
1bef0 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69  r->nWrite;.#endi
1bf00 66 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  f.  return a;.}.
1bf10 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
1bf20 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
1bf30 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
1bf40 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
1bf50 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
1bf60 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
1bf70 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
1bf80 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
1bf90 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
1bfa0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
1bfb0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1bfc0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
1bfd0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
1bfe0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
1bff0 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
1c000 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
1c010 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c020 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
1c030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c040 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
1c050 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
1c060 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
1c070 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
1c080 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
1c090 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1c0a0 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
1c0b0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
1c0c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c0d0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1c0e0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
1c0f0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1c100 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c110 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1c120 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
1c130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c140 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1c150 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1c160 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
1c170 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
1c180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c190 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1c1a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c1b0 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
1c1c0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
1c1d0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1c1e0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1c1f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c200 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
1c210 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
1c220 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
1c230 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
1c240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c250 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1c260 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1c270 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1c280 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1c290 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
1c2a0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
1c2b0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1c2c0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
1c2d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
1c2e0 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
1c2f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
1c300 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
1c310 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
1c320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1c330 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1c340 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1c350 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
1c360 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
1c370 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
1c380 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
1c390 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
1c3a0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1c3b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c3c0 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
1c3d0 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
1c3e0 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
1c3f0 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1c400 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1c410 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
1c420 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
1c430 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c440 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c450 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1c460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c470 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
1c480 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
1c490 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
1c4a0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1c4b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
1c4c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1c4d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
1c4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c4f0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
1c500 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1c510 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c520 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
1c530 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1c540 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1c550 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1c560 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
1c570 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
1c580 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1c590 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1c5a0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1c5b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
1c5c0 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
1c5d0 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
1c5e0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1c5f0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1c600 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
1c610 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
1c620 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
1c630 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c640 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
1c650 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1c660 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1c670 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
1c680 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
1c690 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
1c6a0 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
1c6b0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
1c6c0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1c6d0 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1c6e0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1c6f0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
1c700 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
1c710 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1c720 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1c730 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1c740 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c750 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1c760 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1c770 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c780 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
1c790 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c7a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c7b0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
1c7c0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1c7d0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1c7e0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1c7f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1c800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c810 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
1c820 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c830 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c840 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
1c850 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c860 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
1c870 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c880 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52    TRACE2("STMT-R
1c890 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
1c8a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c8b0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1c8c0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
1c8d0 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
1c8e0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
1c8f0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1c900 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
1c910 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c920 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c930 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1c950 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1c960 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
1c970 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c980 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
1c990 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c9a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c9b0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1c9c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1c9d0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1c9e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1c9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1ca00 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1ca10 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
1ca20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
1ca30 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1ca40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ca50 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1ca60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
1ca70 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
1ca80 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1ca90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1caa0 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
1cab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1cac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cad0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1cae0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1caf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cb00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cb10 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1cb20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cb30 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1cb40 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1cb50 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
1cb60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cb70 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
1cb80 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
1cb90 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
1cba0 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
1cbb0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1cbc0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1cbd0 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
1cbe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1cbf0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
1cc00 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
1cc10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1cc20 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1cc30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1cc40 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1cc50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
1cc60 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
1cc70 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cc80 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
1cc90 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
1cca0 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
1ccb0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
1ccc0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
1ccd0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
1cce0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
1ccf0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
1cd00 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
1cd10 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e  t sqlite3pager_n
1cd20 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
1cd30 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1cd40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
1cd50 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1cd60 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
1cd70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
1cd80 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
1cd90 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
1cda0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
1cdb0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1cdc0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1cdd0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1cde0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1cdf0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1ce00 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1ce10 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1ce20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ce30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1ce40 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1ce50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1ce60 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1ce70 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1ce80 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1ce90 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1cea0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1ceb0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1cec0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
1ced0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
1cee0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1cef0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1cf00 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1cf10 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1cf20 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1cf30 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1cf40 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1cf50 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1cf60 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1cf70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1cf80 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1cf90 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1cfa0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1cfb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1cfc0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1cfd0 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1cfe0 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1cff0 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
1d000 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1d010 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
1d020 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1d030 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1d040 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
1d050 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1d060 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1d070 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1d080 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1d090 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1d0a0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68    store32bits(ch
1d0b0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50  ange_counter, pP
1d0c0 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
1d0d0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1d0e0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1d0f0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1d100 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
1d110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1d130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d140 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1d150 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1d160 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1d170 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1d180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1d190 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1d1a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1d1b0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1d1c0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1d1d0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1d1e0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1d1f0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1d200 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1d210 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1d220 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1d230 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d240 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1d250 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1d260 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1d270 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1d280 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d290 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1d2a0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1d2b0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1d2c0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1d2d0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1d2e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1d2f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d300 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1d310 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d320 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1d330 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1d340 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1d350 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1d360 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1d370 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1d380 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1d390 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1d3a0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1d3b0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1d3c0 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1d3d0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1d3e0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1d3f0 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1d400 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1d410 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1d420 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1d430 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d440 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1d450 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1d460 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1d470 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1d480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d490 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1d4a0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1d4b0 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1d4c0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1d4d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1d4e0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1d4f0 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1d500 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1d510 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1d520 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1d530 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1d540 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1d550 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d560 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1d570 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1d580 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1d590 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1d5a0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d5b0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1d5c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1d5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d5e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d5f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
1d600 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d610 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1d620 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d630 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1d640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d650 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1d660 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1d670 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1d680 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1d690 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1d6a0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1d6b0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1d6c0 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1d6d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1d6e0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1d6f0 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1d700 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1d710 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d720 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1d730 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1d740 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1d750 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1d760 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1d770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d780 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d790 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
1d7a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d7b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d7c0 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
1d7d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d7e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
1d7f0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1d800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1d810 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1d820 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1d830 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1d840 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1d850 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1d860 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1d870 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1d880 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d890 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1d8a0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
1d8b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d8c0 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   i;.        void
1d8d0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d8e0 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1d8f0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1d900 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1d910 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1d920 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d930 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1d940 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1d950 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1d960 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1d970 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1d980 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d990 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1d9a0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1d9b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d9d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d9e0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1d9f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1da00 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1da10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1da20 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1da30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1da40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1da50 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1da60 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1da70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1da80 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1da90 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1daa0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1dab0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1dac0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dad0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1dae0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1daf0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1db00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1db10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1db20 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1db30 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1db40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1db50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1db60 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1db70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1db80 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1db90 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1dba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dbb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dbc0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1dbd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1dbe0 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1dbf0 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1dc00 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1dc10 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1dc20 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1dc30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1dc40 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1dc50 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1dc60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dc70 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1dc80 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1dc90 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1dca0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1dcb0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1dcc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1dcd0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1dce0 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1dcf0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
1dd00 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1dd10 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
1dd20 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1dd30 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1dd40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1dd50 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1dd60 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1dd70 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1dd80 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1dd90 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1dda0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1ddb0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1ddc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1ddd0 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1dde0 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1ddf0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1de00 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1de10 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1de20 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1de30 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1de40 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1de50 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1de60 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1de70 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1de80 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1de90 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1dea0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1deb0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1dec0 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1ded0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1dee0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1def0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1df00 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1df10 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1df20 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1df30 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1df40 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1df50 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1df60 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1df70 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1df80 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1df90 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1dfa0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1dfb0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1dfc0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1dfd0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1dfe0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1dff0 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1e000 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1e010 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1e020 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1e030 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1e040 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1e050 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1e060 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1e070 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1e080 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1e090 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1e0a0 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1e0b0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1e0c0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1e0d0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1e0e0 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1e0f0 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1e100 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1e110 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1e120 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1e130 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1e140 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1e150 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1e160 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1e170 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e180 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1e190 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1e1a0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1e1b0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1e1c0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1e1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e1e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1e1f0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1e200 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1e210 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1e220 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1e230 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1e240 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1e250 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1e260 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1e270 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1e280 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1e290 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1e2a0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1e2b0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1e2c0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1e2d0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1e2e0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e2f0 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1e300 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1e310 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1e320 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1e330 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1e340 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1e350 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1e360 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1e370 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e380 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1e390 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1e3a0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e3b0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1e3c0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1e3d0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1e3e0 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1e3f0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1e400 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1e410 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e420 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1e430 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1e440 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e450 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e460 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1e470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e480 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e490 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1e4a0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1e4b0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1e4c0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1e4d0 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1e4e0 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1e4f0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1e500 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1e510 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e520 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1e530 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e540 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e550 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1e560 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e570 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1e580 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1e590 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e5a0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1e5b0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1e5c0 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1e5d0 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1e5e0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1e5f0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e600 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1e610 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1e620 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1e630 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1e640 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1e650 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1e660 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1e670 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1e680 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e690 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e6a0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1e6b0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1e6c0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1e6d0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1e6e0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1e6f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1e700 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1e710 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1e720 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1e730 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1e740 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1e750 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1e760 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1e770 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e780 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1e790 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e7a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e7b0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1e7c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1e7d0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1e7e0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1e7f0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1e800 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1e810 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1e820 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1e830 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1e840 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e850 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1e860 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e870 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1e880 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1e890 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1e8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e8b0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1e8c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1e8d0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e8e0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1e8f0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1e900 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e910 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1e920 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1e930 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e940 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1e950 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1e960 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1e970 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1e980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e990 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1e9a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e9b0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e9c0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1e9d0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1e9e0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1e9f0 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1ea00 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1ea10 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1ea20 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1ea30 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1ea40 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1ea50 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1ea60 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1ea70 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1ea80 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1ea90 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1eaa0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1eab0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1eac0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1ead0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1eae0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1eaf0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1eb00 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1eb10 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1eb20 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1eb30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1eb40 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1eb50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1eb60 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1eb70 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1eb80 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1eb90 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1eba0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1ebb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ebc0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ebd0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1ebe0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1ebf0 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1ec00 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1ec10 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1ec20 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1ec30 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1ec40 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1ec50 2f 0a                                            /.