/ Hex Artifact Content
Login

Artifact 681b4e39d581ead8fd54283176138bec924a4bae:


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 32  : pager.c,v 1.22
0350: 39 20 32 30 30 35 2f 31 32 2f 33 30 20 31 36 3a  9 2005/12/30 16:
0360: 32 38 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39 37  28:02 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 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
2460: 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c  r {.  u8 journal
2470: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2480: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
2490: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
24a0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
24b0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
24c0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
24d0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
24e0: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
24f0: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
2500: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
2510: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
2520: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2530: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
2540: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
2550: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2560: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
2570: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
2580: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
2590: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
25a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
25c0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
25d0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
25e0: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
25f0: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
2600: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
2610: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
2620: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
2630: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
2640: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
2650: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
2660: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
2670: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
26a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
26b0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
26c0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
26d0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
26e0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
26f0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2700: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74  tness */.  u8 st
2710: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2720: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2730: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2740: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2750: 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b   */.  u8 errMask
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2770: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
2780: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
2790: 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ors */.  u8 temp
27a0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
27b0: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
27c0: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
27d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
27e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
27f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2800: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2810: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2820: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2840: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2850: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2860: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2870: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2890: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
28a0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
28b0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
28c0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
28d0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
28e0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
28f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
2900: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2920: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2930: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
2940: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2960: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2970: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2980: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e   to jrnl */.  in
2990: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
29a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
29c0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
29d0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
29e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
29f0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2a00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2a10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2a40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2a50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2a60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2a90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2aa0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2ab0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2ad0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2ae0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2af0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2b00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2b30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2b40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2b70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2b80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2b90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2bb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2bc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2bd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2c00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2c10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2c20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2c30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2c40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2c50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2c80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2c90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2ca0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2cd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2ce0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2cf0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2d20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2d30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2d40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2d70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2d80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2d90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2da0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dc0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2dd0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2de0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2df0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2e10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2e20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2e30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2e40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2e60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2e70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2e80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2e90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2ea0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2ed0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2ee0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ef0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
2f00: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
2f10: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2f20: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
2f30: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2f40: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
2f50: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
2f60: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
2f70: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2f80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2f90: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2fa0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2fb0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2fe0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2ff0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3000: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3010: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3020: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3030: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3040: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3050: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3060: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
3070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3080: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3090: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
30a0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
30b0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
30c0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
30d0: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30f0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
3100: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
3110: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3120: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
3140: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
3150: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
3160: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
3170: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
3180: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3190: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
31a0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
31b0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
31c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
31d0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
31e0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
31f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3200: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3210: 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20  , nMiss, nOvfl; 
3220: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3230: 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20  s, missing, and 
3240: 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  LRU overflows */
3250: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72  .  int nRead,nWr
3260: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ite;           /
3270: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
3280: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
3290: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
32a0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f  *xDestructor)(vo
32b0: 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  id*,int); /* Cal
32c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
32d0: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
32e0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
32f0: 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69  einiter)(void*,i
3300: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
3310: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3320: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3330: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3340: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
3350: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
3360: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
3370: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
3380: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
3390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
33b0: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20  o xCodec() */.  
33c0: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
33d0: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
33e0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
33f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
3400: 50 67 48 64 72 20 2a 2f 0a 23 69 66 6e 64 65 66  PgHdr */.#ifndef
3410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3420: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
3430: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3450: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  Linked list of p
3460: 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68  agers in this th
3470: 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  read */.#endif.}
3480: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  ;../*.** If SQLI
3490: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
34a0: 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  ed then incremen
34b0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67  t the variable g
34c0: 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61  iven in.** the a
34d0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65  rgument.*/.#ifde
34e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20  f SQLITE_TEST.# 
34f0: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3500: 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23  (x)  x++.#else.#
3510: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3520: 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(x).#endif../*.
3530: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
3540: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
3550: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
3560: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  sk..**.** TODO: 
3570: 4d 61 79 62 65 20 77 65 20 6a 75 73 74 20 77 61  Maybe we just wa
3580: 6e 74 20 61 20 76 61 72 69 61 62 6c 65 20 2d 20  nt a variable - 
3590: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 43  Pager.errCode. C
35a0: 61 6e 20 77 65 20 72 65 61 6c 6c 79 20 0a 2a 2a  an we really .**
35b0: 20 20 20 20 20 20 20 68 61 76 65 20 74 77 6f 20         have two 
35c0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 65 72 72  simultaneous err
35d0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 3f 0a 2a  or conditions?.*
35e0: 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 69 6e 67 20  *.** Recovering 
35f0: 66 72 6f 6d 20 61 6e 20 53 51 4c 49 54 45 5f 46  from an SQLITE_F
3600: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ULL, SQLITE_LOCK
3610: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
3620: 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   or .** SQLITE_I
3630: 4f 45 52 52 20 65 72 72 6f 72 20 69 73 20 6e 6f  OERR error is no
3640: 74 20 61 20 73 69 6d 70 6c 65 20 6d 61 74 74 65  t a simple matte
3650: 72 2c 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20  r, particularly 
3660: 69 66 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  if the pager .**
3670: 20 63 61 63 68 65 20 69 73 20 73 68 61 72 65 64   cache is shared
3680: 20 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70 6c   between multipl
3690: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
36a0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  *.** SQLITE_FULL
36b0: 20 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c   (PAGER_ERR_FULL
36c0: 29 3a 0a 2a 2a 20 20 20 20 20 43 6c 65 61 72 65  ):.**     Cleare
36d0: 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  d when the trans
36e0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
36f0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   back..**.** SQL
3700: 49 54 45 5f 43 4f 52 52 55 50 54 20 28 50 41 47  ITE_CORRUPT (PAG
3710: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 29 3a  ER_ERR_CORRUPT):
3720: 0a 2a 2a 20 20 20 20 20 43 61 6e 6e 6f 74 20 62  .**     Cannot b
3730: 65 20 63 6c 65 61 72 65 64 2e 20 54 68 65 20 75  e cleared. The u
3740: 70 70 65 72 20 6c 61 79 65 72 20 6d 75 73 74 20  pper layer must 
3750: 63 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e  close the curren
3760: 74 20 70 61 67 65 72 20 0a 2a 2a 20 20 20 20 20  t pager .**     
3770: 61 6e 64 20 6f 70 65 6e 20 61 20 6e 65 77 20 6f  and open a new o
3780: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3790: 69 6c 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ile to continue.
37a0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 50 52  .**.** SQLITE_PR
37b0: 4f 54 4f 43 4f 4c 20 28 50 41 47 45 52 5f 45 52  OTOCOL (PAGER_ER
37c0: 52 5f 4c 4f 43 4b 29 3a 0a 2a 2a 20 20 20 20 20  R_LOCK):.**     
37d0: 54 68 69 73 20 65 72 72 6f 72 20 6f 6e 6c 79 20  This error only 
37e0: 6f 63 63 75 72 73 20 69 66 20 61 6e 20 69 6e 74  occurs if an int
37f0: 65 72 6e 61 6c 20 65 72 72 6f 72 20 6f 63 63 75  ernal error occu
3800: 72 73 20 6f 72 20 61 6e 6f 74 68 65 72 20 70 72  rs or another pr
3810: 6f 63 65 73 73 20 0a 2a 2a 20 20 20 20 20 69 73  ocess .**     is
3820: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
3830: 68 65 20 73 71 6c 69 74 65 20 6c 6f 63 6b 69 6e  he sqlite lockin
3840: 67 20 70 72 6f 74 6f 63 6f 6c 20 28 69 2e 65 2e  g protocol (i.e.
3850: 20 73 6f 6d 65 6f 6e 65 20 69 73 20 0a 2a 2a 20   someone is .** 
3860: 20 20 20 20 6d 61 6e 69 70 75 6c 61 74 69 6e 67      manipulating
3870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3880: 6c 65 20 75 73 69 6e 67 20 73 6f 6d 65 74 68 69  le using somethi
3890: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 73 71  ng other than sq
38a0: 6c 69 74 65 29 2e 0a 2a 2a 20 20 20 20 20 54 68  lite)..**     Th
38b0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  is is handled in
38c0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
38d0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
38e0: 74 69 6f 6e 20 2d 20 74 68 65 20 65 72 72 6f 72  tion - the error
38f0: 20 0a 2a 2a 20 20 20 20 20 63 61 6e 6e 6f 74 20   .**     cannot 
3900: 62 65 20 63 6c 65 61 72 65 64 20 65 78 63 65 70  be cleared excep
3910: 74 20 62 79 20 63 6c 6f 73 69 6e 67 20 74 68 65  t by closing the
3920: 20 63 75 72 72 65 6e 74 20 70 61 67 65 72 20 61   current pager a
3930: 6e 64 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 20  nd opening .**  
3940: 20 20 20 61 20 62 72 61 6e 64 20 6e 65 77 20 6f     a brand new o
3950: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3960: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
3970: 45 5f 49 4f 45 52 52 20 28 50 41 47 45 52 5f 45  E_IOERR (PAGER_E
3980: 52 52 5f 44 49 53 4b 29 3a 0a 2a 2a 20 20 20 20  RR_DISK):.**    
3990: 20 43 6c 65 61 72 65 64 20 77 68 65 6e 20 74 68   Cleared when th
39a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
39b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
39c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
39d0: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
39e0: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
39f0: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
3a00: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3a10: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 65 72 72      0x02  /* err
3a20: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
3a30: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
3a40: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3a50: 43 4f 52 52 55 50 54 20 20 30 78 30 34 20 20 2f  CORRUPT  0x04  /
3a60: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
3a70: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
3a80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
3a90: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
3aa0: 78 30 38 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x08  /* general 
3ab0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
3ac0: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
3ad0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
3ae0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3af0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3b00: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3b10: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3b20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3b30: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
3b40: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
3b50: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3b60: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3b70: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3b80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3b90: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3ba0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3bb0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3bc0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3bd0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3be0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3bf0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3c00: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3c10: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3c20: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3c30: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3c40: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3c50: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3c60: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3c70: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3c80: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3c90: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3ca0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3cc0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3cd0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3ce0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3cf0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3d00: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3d10: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3d20: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3d30: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3d40: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3d50: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3d60: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3d70: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3d80: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3d90: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3da0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3db0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3dc0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3de0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3df0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3e00: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3e10: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3e20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3e30: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3e40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3e50: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3e60: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3e70: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3e80: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3e90: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3ea0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3eb0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3ec0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3ed0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3ee0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3ef0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3f00: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3f10: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3f20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3f30: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3f40: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3f50: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3f60: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3f70: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3f80: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3f90: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3fa0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3fb0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3fc0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3fd0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3fe0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3ff0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4000: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
4010: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
4020: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
4030: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
4040: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
4050: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
4060: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
4070: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
4090: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
40a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
40b0: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
40c0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
40d0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
40e0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
40f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
4100: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
4110: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
4120: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
4130: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
4140: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
4150: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4160: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4170: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4180: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4190: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
41a0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
41b0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
41c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
41d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
41e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
41f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
4200: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
4210: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
4220: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4230: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4240: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4250: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4260: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4270: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4280: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
42a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
42b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
42c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
42d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
42e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
42f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
4300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
4310: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
4320: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4330: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4340: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4350: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4360: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
4370: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a   a disk sector.*
4380: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
4390: 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a  SECTOR_SIZE 512.
43a0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43b0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
43c0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
43d0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
43e0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
43f0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4400: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4410: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4420: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4430: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4440: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4450: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
4460: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
4480: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
4490: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44a0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44b0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
44c0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
44d0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
44e0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
44f0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4500: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4510: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4520: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4530: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4540: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4550: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
4560: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
4570: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
4580: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
4590: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45a0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45b0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
45c0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
45d0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
45e0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
45f0: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4600: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4610: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4620: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4630: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4640: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4650: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
4660: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
4670: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
4680: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
4690: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46a0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46b0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
46c0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
46d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
46e0: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
46f0: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4700: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
4710: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
4720: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
4730: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4740: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
4750: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
4760: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
4770: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4780: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
4790: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47a0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
47b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
47c0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
47d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
47e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
47f0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4800: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4810: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4820: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4830: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4840: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4850: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4860: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4870: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
4880: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
4890: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
48a0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
48b0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
48c0: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
48d0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72   *pRes){.  u32 r
48e0: 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  es;.  int rc;.  
48f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4900: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
4910: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
4920: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4930: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
4940: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
4950: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
4960: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
4970: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
4980: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
4990: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
49a0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
49b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
49c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
49d0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
49e0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
49f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4a00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4a10: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4a20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4a30: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4a40: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4a50: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
4a60: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4a70: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
4a80: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4a90: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
4aa0: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
4ab0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
4ac0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
4ad0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
4ae0: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
4af0: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
4b00: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
4b10: 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f  fd, ac, 4);.}../
4b20: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33  *.** Write the 3
4b30: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27 76  2-bit integer 'v
4b40: 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67  al' into the pag
4b50: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
4b60: 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27  page header.** '
4b70: 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  p' at offset 'of
4b80: 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  fset'..*/.static
4b90: 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74   void store32bit
4ba0: 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72  s(u32 val, PgHdr
4bb0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
4bc0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4bd0: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
4be0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4bf0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4c00: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b  )[offset];.  ac[
4c10: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
4c20: 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d   0xff;.  ac[1] =
4c30: 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66   (val>>16) & 0xf
4c40: 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61  f;.  ac[2] = (va
4c50: 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20  l>>8) & 0xff;.  
4c60: 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78  ac[3] = val & 0x
4c70: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ff;.}../*.** Rea
4c80: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4c90: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
4ca0: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
4cb0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4cc0: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
4cd0: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
4ce0: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
4cf0: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
4d00: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4d20: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4d30: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4d40: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4d50: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
4d60: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4d70: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4d80: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
4d90: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
4da0: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
4db0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
4dc0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
4dd0: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
4de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4df0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
4e00: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4e10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4e20: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
4e30: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4e40: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
4e50: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
4e60: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
4e70: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4e80: 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20  ER_ERR_DISK )   
4e90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
4ea0: 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  RR;.  if( pPager
4eb0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4ec0: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20  R_ERR_FULL )    
4ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
4ee0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4ef0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4f00: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
4f10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4f20: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
4f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4f40: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
4f50: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
4f60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
4f70: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
4f80: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
4f90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 69 74   appropriate bit
4fa0: 73 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  s in Pager.errMa
4fb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
4fc0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4fd0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4fe0: 20 72 63 29 7b 0a 20 20 73 77 69 74 63 68 28 20   rc){.  switch( 
4ff0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
5000: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 0a  QLITE_PROTOCOL:.
5010: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
5020: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5030: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62  RR_LOCK;.      b
5040: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5050: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 0a 20 20 20  QLITE_IOERR:.   
5060: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
5070: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
5080: 44 49 53 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  DISK;.      brea
5090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
50a0: 54 45 5f 46 55 4c 4c 3a 0a 20 20 20 20 20 20 70  TE_FULL:.      p
50b0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
50c0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
50d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
50f0: 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20 70 50  ORRUPT:.      pP
5100: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
5110: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5120: 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  PT;.      break;
5130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5140: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5150: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
5160: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
5170: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
5180: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
5190: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
51a0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
51b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
51c0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
51d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
51e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
51f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5200: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5210: 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72  TA(pPage);.  for
5220: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70  (i=0; i<pPage->p
5230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
5240: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
5250: 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61  = (hash+i)^pData
5260: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
5270: 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n hash;.}../*.**
5280: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5290: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
52a0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
52b0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
52c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
52d0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
52e0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
52f0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5300: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5310: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5320: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5330: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5340: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
5350: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
5360: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5370: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
5380: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5390: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
53a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
53b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
53c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
53d0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
53e0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  | pPager->errMas
53f0: 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  k || MEMDB || pP
5400: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
5410: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
5420: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5430: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5440: 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  e.#define CHECK_
5450: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
5460: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
5470: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
5480: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
5490: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
54a0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
54b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54c0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
54d0: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
54e0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
54f0: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5500: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5510: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5520: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
5530: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
5540: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
5550: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5560: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
5570: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
5580: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
5590: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
55a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
55b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
55c0: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
55d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
55e0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
55f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5600: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
5610: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
5620: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
5630: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5640: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
5650: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
5660: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
5670: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
5680: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
5690: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
56a0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
56b0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
56c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
56d0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
56e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
56f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5700: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5710: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5720: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5730: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
5740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5750: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
5760: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5770: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
5780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5790: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
57b0: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
57c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
57e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
57f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5800: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
5810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5820: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5830: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5840: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5860: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5870: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5880: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5890: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
58a0: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
58b0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
58c0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
58d0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
58e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
58f0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
5900: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5910: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
5920: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5930: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5940: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5950: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5960: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
5970: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
5980: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
5990: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
59a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
59b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
59c0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
59d0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
59e0: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
59f0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5a00: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5a10: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5a20: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5a30: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5a40: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5a50: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5a60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5a70: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5a80: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5a90: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
5aa0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
5ab0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
5ac0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
5ad0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
5ae0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5af0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5b00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
5b10: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5b20: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
5b40: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
5b50: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5b60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5b80: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
5b90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
5ba0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5bb0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5bc0: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5bd0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5be0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5bf0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5c00: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5c10: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5c20: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5c30: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5c40: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5c50: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5c60: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5c70: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5cc0: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5ce0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5d00: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5d30: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
5d40: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5d50: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
5d60: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
5d70: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5d80: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
5d90: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
5da0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5db0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5dc0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5dd0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5de0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5df0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5e00: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
5e10: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
5e30: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
5e40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5e50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
5e60: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
5e70: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
5e80: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
5e90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
5ea0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
5eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5ec0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5ed0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5ee0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5ef0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5f00: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5f10: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
5f20: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
5f30: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
5f40: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
5f50: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5f60: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
5f70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5f80: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5f90: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5fa0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5fc0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5fd0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5fe0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5ff0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
6000: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
6010: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
6020: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
6030: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
6040: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
6050: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
6060: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
6070: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
6080: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6090: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
60a0: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
60b0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
60c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
60d0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
60e0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
60f0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
6100: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6110: 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  r){..  int rc = 
6120: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6130: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6140: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6160: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
6170: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6180: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
6190: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
61a0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
61b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
61c0: 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67  lHdr;.  }.  pPag
61d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
61e0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
61f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
6200: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
6210: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
6220: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
6230: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
6240: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
6250: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
6260: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
6270: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
6280: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
6290: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
62a0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
62b0: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
62c0: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
62d0: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
62e0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
62f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
6300: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
6310: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
6320: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6330: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
6340: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
6350: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
6360: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6370: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6380: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
6390: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
63a0: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
63b0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
63c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
63d0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
63e0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
63f0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
6420: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6430: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20  tialiser */ .   
6440: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6450: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6460: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6470: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6480: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
6490: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
64a0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
64b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
64c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
64d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
64e0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
64f0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    rc =
6500: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
6510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
6520: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
6530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6540: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6550: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6560: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6570: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
6580: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
6590: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
65a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
65b0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
65c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
65d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
65e0: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
65f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6600: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
6610: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
6620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6630: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
6640: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6650: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6660: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6670: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
66a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
66b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
66c0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
66d0: 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20  , "\000", 1);.  
66e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
66f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6710: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6720: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
6730: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
6740: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
6750: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
6760: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
6770: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6780: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
6790: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
67a0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
67b0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
67c0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
67d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
67e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
67f0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6800: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6810: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
6820: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
6830: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6840: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
6850: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
6860: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
6870: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6880: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
6890: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
68a0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
68b0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
68c0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
68d0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
68e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
68f0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6900: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6910: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6920: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
6930: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
6940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6950: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
6960: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
6970: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
6980: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
6990: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
69a0: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
69b0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
69c0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
69d0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
69e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
69f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6a00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6a10: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
6a20: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
6a30: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
6a40: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
6a50: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
6a60: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
6a70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
6a80: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6a90: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6aa0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6ab0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6ac0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6ad0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6ae0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6af0: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6b00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6b10: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6b20: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6b30: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6b40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6b50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6b60: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6b70: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6b80: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
6b90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6ba0: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
6bb0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6bc0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6bd0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6bf0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6c10: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6c20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6c30: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6c40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6c50: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
6c60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6c70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6c90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6ca0: 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  d, pDbSize);.  i
6cb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6cc0: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
6cd0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
6ce0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
6cf0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
6d00: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
6d10: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
6d20: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
6d30: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
6d40: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
6d50: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
6d60: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
6d70: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
6d80: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
6d90: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
6da0: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
6db0: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
6dc0: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
6dd0: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
6de0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
6df0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
6e00: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
6e10: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6e30: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6e40: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6e50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6e60: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6e70: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6e80: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6e90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6ea0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6eb0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6ec0: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6ed0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6ee0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6ef0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6f00: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6f20: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6f30: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6f40: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
6f50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6f60: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
6f70: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
6f80: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
6f90: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
6fa0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6fb0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6fd0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6fe0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6ff0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7000: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7010: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7020: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7030: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7040: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7050: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7060: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7070: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7080: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7090: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
70a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
70b0: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
70c0: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
70d0: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
70e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
70f0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7100: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7110: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7120: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7130: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7140: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7150: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7160: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7170: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7180: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7190: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
71a0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
71b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
71c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
71d0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
71e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
71f0: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7200: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
7210: 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61   0; ..  if( !zMa
7220: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
7230: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
7240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
7250: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7260: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
7270: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
7280: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
7290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
72a0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
72c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
72d0: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
72e0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
72f0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
7300: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
7320: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
7330: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
7340: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
7350: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
7360: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7370: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
7380: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
7390: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
73a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
73b0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
73c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
73e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
73f0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
7400: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
7410: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  s(pPager->jfd, P
7420: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
7430: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
7440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7450: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7460: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7470: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
7480: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
7490: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74b0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
74c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e  pPager->jfd, len
74d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
7500: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
7510: 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  jfd, cksum);.  i
7520: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7530: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7550: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7580: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7590: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
75a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
75b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
75c0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
75d0: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
75e0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
75f0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7600: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7610: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7620: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7630: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7640: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7650: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
7660: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
7670: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7680: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7690: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
76a0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
76b0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
76c0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
76d0: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
76e0: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
76f0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7700: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7710: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7720: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7730: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7740: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7750: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7760: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7770: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7780: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7790: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
77a0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
77b0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
77c0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
77d0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
77e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
77f0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7800: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7810: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7820: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7830: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7840: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7850: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
7860: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
7870: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7880: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7890: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
78a0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
78b0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
78c0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
78d0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
78e0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
78f0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7900: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7910: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7920: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7930: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7940: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7950: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
7960: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
7970: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7980: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7990: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
79a0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
79b0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
79c0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
79d0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
79e0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
79f0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7a00: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7a10: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7a20: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7a30: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7a40: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7a50: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7a60: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7a70: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7a80: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7a90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7aa0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7ab0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7ac0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7ad0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7ae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7af0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7b00: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7b10: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7b20: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7b30: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7b40: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7b50: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7b60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7b70: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7b80: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7b90: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7ba0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7bb0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7bc0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7bd0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7be0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7bf0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7c00: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7c10: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7c20: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7c30: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7c40: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7c50: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7c60: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7c70: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c90: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7ca0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7cb0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7cc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7cd0: 72 4d 61 73 6b 20 29 20 72 65 74 75 72 6e 3b 0a  rMask ) return;.
7ce0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7cf0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7d00: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7d10: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7d20: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7d30: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7d40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7d50: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7d60: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7d70: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7d80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7d90: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
7da0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
7db0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7dc0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7dd0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7de0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7df0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e00: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e10: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7e20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7e30: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7e40: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7e50: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7e60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7e70: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7e80: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7e90: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7ec0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7ed0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7ee0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7ef0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7f00: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7f10: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7f20: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7f30: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7f40: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7f50: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7f60: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7f70: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7f80: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7f90: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7fa0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7fb0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7fc0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7fd0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7fe0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7ff0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
8000: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
8010: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
8020: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
8030: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
8040: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
8050: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
8060: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
8070: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
8080: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8090: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
80a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
80b0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
80c0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
80d0: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
80e0: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
80f0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8100: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8110: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
8120: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
8130: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
8140: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
8150: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
8160: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
8170: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
8180: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
8190: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
81a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
81b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
81c0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
81d0: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
81e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
81f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
8200: 2e 78 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  .xDelete(pPager-
8210: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
8220: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
8230: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
8240: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
8250: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8260: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
8270: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
8280: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
8290: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
82a0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
82b0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
82c0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
82d0: 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  Sync = 0;.#ifdef
82e0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
82f0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
8300: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
8310: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8320: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8330: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8340: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8350: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8360: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8370: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
8380: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
8390: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
83a0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
83b0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
83c0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
83d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
83e0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
83f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
8400: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8410: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
8420: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8430: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8440: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8450: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8460: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8470: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
8480: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
8490: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
84a0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
84b0: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
84c0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
84d0: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
84e0: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
84f0: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
8500: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
8510: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
8520: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
8530: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
8540: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
8550: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
8560: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
8570: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
8580: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
8590: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
85a0: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
85b0: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
85c0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
85d0: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
85e0: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
85f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
8600: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
8610: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
8620: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
8630: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
8640: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
8650: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
8660: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
8670: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
8680: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
8690: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
86a0: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
86b0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
86c0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
86d0: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
86e0: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
86f0: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
8700: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
8710: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
8720: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
8730: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
8740: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
8750: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
8760: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
8770: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
8780: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
8790: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
87a0: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
87b0: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
87c0: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
87d0: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
87e0: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
87f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
8800: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
8810: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
8820: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
8830: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
8840: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8850: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
8860: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
8870: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
8880: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
8890: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
88a0: 67 6e 6f 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  gno, const u8 *a
88b0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
88c0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
88d0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
88e0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
88f0: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8900: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8910: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8920: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8930: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
8950: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
8960: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
8970: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
8980: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
8990: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
89a0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
89b0: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
89c0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
89d0: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
89e0: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
89f0: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
8a00: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
8a10: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8a20: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
8a30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
8a40: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
8a50: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
8a60: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
8a70: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
8a80: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
8a90: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
8aa0: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
8ab0: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
8ac0: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
8af0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
8b00: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
8b10: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8b20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
8b30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
8b40: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
8b50: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
8b80: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
8b90: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
8ba0: 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ata[SQLITE_MAX_P
8bb0: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54  AGE_SIZE];  /* T
8bc0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
8bd0: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
8be0: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
8bf0: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
8c00: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
8c10: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
8c20: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8c30: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
8c40: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
8c50: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
8c60: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
8c70: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
8c80: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
8c90: 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63  >stfd) );...  rc
8ca0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8cb0: 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  d, &pgno);.  if(
8cc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
8ce0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8cf0: 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50  (jfd, &aData, pP
8d00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8d10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8d20: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8d30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8d40: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
8d50: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
8d60: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8d70: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
8d80: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
8d90: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
8da0: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
8db0: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
8dc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
8dd0: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
8de0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8df0: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
8e00: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
8e10: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
8e20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8e30: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
8e40: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
8e50: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
8e60: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
8e70: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
8e80: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
8e90: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
8ea0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
8eb0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
8ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8ed0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
8ee0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
8ef0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
8f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8f10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8f20: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
8f30: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
8f40: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
8f50: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
8f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
8f70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8f80: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
8f90: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
8fa0: 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21  r, pgno, aData)!
8fb0: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
8fc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8fd0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
8fe0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8ff0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
9000: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
9010: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9020: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
9030: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
9040: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
9050: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
9060: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
9070: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
9080: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9090: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
90a0: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
90b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
90c0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
90d0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
90e0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
90f0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
9100: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
9110: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
9120: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
9130: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
9140: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
9150: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
9160: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
9170: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
9180: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
9190: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
91a0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
91b0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
91c0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
91d0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
91e0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
91f0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9200: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9210: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9220: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9230: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9240: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9250: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9260: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9270: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9280: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9290: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
92a0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
92b0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
92c0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
92d0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
92e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
92f0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9300: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9310: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9320: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9330: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9340: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9350: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9360: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9370: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9380: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9390: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
93a0: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
93b0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
93c0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
93d0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
93e0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
93f0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9400: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9410: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9420: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9430: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9440: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9450: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9460: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9470: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9480: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9490: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
94a0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
94b0: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
94c0: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
94d0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
94e0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
94f0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9500: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9520: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9530: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9540: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
9550: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9560: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9570: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9580: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9590: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
95a0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
95b0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
95c0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
95d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
95e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
95f0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9610: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9620: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9630: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9640: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9650: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9660: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9670: 20 20 69 66 28 20 70 50 67 20 29 20 70 50 67 2d    if( pPg ) pPg-
9680: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
9690: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
96a0: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
96b0: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
96c0: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
96d0: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
96e0: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
96f0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
9700: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
9710: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
9720: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
9730: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
9740: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
9750: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
9760: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
9770: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
9780: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
9790: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
97a0: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
97b0: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
97c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
97d0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
97e0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
97f0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9800: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9810: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
9820: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
9830: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9840: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
9850: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
9860: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9870: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9880: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
9890: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
98a0: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
98b0: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
98c0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
98d0: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
98e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
98f0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
9900: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
9910: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
9920: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
9930: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
9940: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
9950: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
9960: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
9970: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9980: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
9990: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
99a0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
99b0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
99c0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
99d0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
99e0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
99f0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
9a00: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
9a10: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
9a20: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9a30: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
9a40: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
9a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9a60: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
9a70: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
9a80: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9a90: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9aa0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
9ab0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
9ac0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
9ad0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9ae0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9af0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
9b00: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
9b10: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
9b20: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
9b30: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
9b40: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
9b50: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
9b60: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
9b70: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
9b80: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
9b90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9ba0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
9bb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
9bc0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
9bd0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
9be0: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
9bf0: 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   *master = 0;.  
9c00: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
9c10: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
9c20: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
9c30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
9c40: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
9c50: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
9c60: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
9c70: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
9c80: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
9c90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9ca0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
9cb0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
9cc0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
9cd0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
9ce0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
9cf0: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
9d00: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
9d10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
9d20: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 52 65 61  lite3Os.xOpenRea
9d30: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
9d40: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
9d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9d60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9d70: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
9d80: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
9d90: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d  ite3OsFileSize(m
9da0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
9db0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
9dc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9dd0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9de0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
9df0: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
9e00: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
9e10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
9e20: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
9e30: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
9e40: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
9e50: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
9e60: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
9e70: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
9e80: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
9e90: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
9ea0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
9eb0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
9ec0: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
9ed0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
9ee0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9ef0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
9f00: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
9f10: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9f20: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9f30: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
9f40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9f50: 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a  OsRead(master, z
9f60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9f70: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9f80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9f90: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9fa0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9fb0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9fc0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9fd0: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9fe0: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9ff0: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
a000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a010: 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73  ite3Os.xFileExis
a020: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
a030: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a040: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
a050: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
a060: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a070: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
a080: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
a090: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
a0a0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
a0b0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
a0c0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
a0d0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
a0e0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
a0f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
a100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
a110: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
a120: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
a130: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
a140: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e   sqlite3Os.xOpen
a150: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
a160: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
a170: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a180: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a190: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a1a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a1b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
a1c0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
a1d0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
a1e0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a1f0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a200: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
a210: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a220: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a230: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a240: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a250: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
a260: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
a270: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
a280: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
a290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
a2a0: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
a2b0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
a2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
a2d0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
a2e0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
a2f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a300: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
a310: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a320: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
a340: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
a350: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
a360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
a370: 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65  qlite3Os.xDelete
a380: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a390: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a3a0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a3b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a3c0: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a3d0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a3e0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a3f0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a400: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a410: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a420: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a430: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a440: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a450: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a460: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a470: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a480: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a490: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a4a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a4b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a4c0: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a4d0: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a4e0: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a4f0: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a500: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a510: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a520: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a530: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a540: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a550: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a560: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a570: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a580: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a590: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a5a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a5b0: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a5c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a5d0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a5e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a5f0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a600: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a610: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a620: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a630: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a640: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a650: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a660: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a670: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a680: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a690: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a6a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a6b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
a6c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a6d0: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
a6e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
a6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a700: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a710: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a720: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
a730: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a740: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
a750: 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70  E3("REFETCH %d p
a760: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
a770: 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
a780: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
a790: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
a7a0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
a7b0: 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e  , zBuf, pPg->pgn
a7c0: 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  o, 2);.    }else
a7d0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a  {.      memset(z
a7e0: 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Buf, 0, pPager->
a7f0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a800: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
a810: 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ef==0 || memcmp(
a820: 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44  zBuf, PGHDR_TO_D
a830: 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
a840: 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
a850: 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
a860: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a870: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a880: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
a890: 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
a8a0: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
a8b0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
a8c0: 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
a8d0: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a8e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a8f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
a900: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
a910: 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
a920: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
a930: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
a940: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65    }.    pPg->nee
a950: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
a960: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
a970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
a980: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a990: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a9a0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a9b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
a9c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a9d0: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
a9e0: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
a9f0: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
aa00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
aa10: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
aa20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa30: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
aa40: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
aa50: 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  t nPage){.  asse
aa60: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
aa70: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
aa80: 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  VE );.  return s
aa90: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
aaa0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
aab0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
aac0: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
aad0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
aae0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
aaf0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
ab00: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
ab10: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
ab20: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
ab30: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
ab40: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
ab50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ab60: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
ab70: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
ab80: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
ab90: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
aba0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
abb0: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
abc0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
abd0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
abe0: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
abf0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
ac00: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
ac10: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
ac20: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
ac30: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
ac40: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
ac50: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
ac60: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
ac70: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
ac80: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
ac90: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
aca0: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
acb0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
acc0: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
acd0: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
ace0: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
acf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
ad00: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ad10: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
ad20: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
ad30: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
ad40: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
ad50: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
ad60: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ad70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
ad80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ad90: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
ada0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
adb0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
adc0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
add0: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
ade0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
adf0: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
ae00: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
ae20: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
ae30: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
ae40: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
ae50: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
ae60: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
ae70: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
ae80: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
ae90: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
aea0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
aeb0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
aec0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
aed0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
aee0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
aef0: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
af00: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
af10: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
af20: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
af30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
af40: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
af50: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
af60: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
af70: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
af80: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
af90: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
afa0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
afb0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
afc0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
afd0: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
afe0: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
aff0: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b000: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b020: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b030: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b040: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b050: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
b060: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
b070: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
b080: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
b090: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
b0a0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
b0b0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
b0c0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
b0d0: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
b0e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b0f0: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
b100: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
b110: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
b120: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
b130: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
b140: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
b150: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
b160: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b170: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
b180: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
b190: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
b1a0: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
b1b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
b1c0: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
b1d0: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
b1e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
b1f0: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
b200: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b210: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
b220: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
b230: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
b240: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
b250: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
b260: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
b270: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b280: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
b290: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
b2a0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
b2b0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
b2c0: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
b2d0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
b2e0: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
b2f0: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
b300: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
b310: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
b320: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
b330: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
b340: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
b350: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
b360: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
b370: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
b380: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
b390: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
b3a0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
b3b0: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
b3c0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
b3d0: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
b3e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b3f0: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b400: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b410: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b420: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b430: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b440: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b450: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
b460: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
b470: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
b480: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
b490: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
b4a0: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
b4b0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
b4c0: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
b4d0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
b4e0: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
b4f0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
b500: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
b510: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
b520: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
b530: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
b540: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
b550: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
b560: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b570: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
b580: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b590: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
b5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b5b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b5c0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
b5d0: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b5f0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
b600: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b610: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b630: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b640: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
b650: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
b660: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
b670: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
b680: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
b6b0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
b6c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
b6d0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
b6e0: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
b6f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
b700: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
b710: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
b720: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
b730: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
b740: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
b750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b760: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
b770: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
b780: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
b790: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
b7a0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
b7b0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
b7c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b7d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b7e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
b7f0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
b800: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
b810: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
b820: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
b830: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
b840: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b850: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
b860: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
b870: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
b880: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
b890: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
b8a0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
b8b0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
b8c0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
b8d0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
b8e0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
b8f0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
b900: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
b910: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
b920: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
b930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
b940: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
b950: 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73 74 73  e3Os.xFileExists
b960: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
b970: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
b980: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
b990: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
b9a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b9b0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
b9c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
b9d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
b9e0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
b9f0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
ba00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ba10: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
ba20: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
ba30: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
ba40: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
ba50: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
ba60: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
ba70: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
ba80: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
ba90: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
baa0: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
bab0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
bac0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
bad0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
bae0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
baf0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
bb00: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
bb10: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
bb20: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
bb30: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
bb40: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
bb50: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
bb60: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
bb70: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
bb80: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
bb90: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
bba0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
bbb0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
bbc0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
bbd0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
bbe0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
bbf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bc00: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
bc10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
bc20: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
bc30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bc40: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
bc50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bc60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
bc70: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
bc80: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
bc90: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
bca0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
bcb0: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
bcc0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
bcd0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
bce0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
bcf0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
bd00: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
bd10: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
bd20: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
bd30: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
bd40: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
bd50: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
bd60: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
bd70: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
bd80: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
bd90: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
bda0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bdb0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
bdc0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
bdd0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
bde0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
bdf0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
be00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
be10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
be20: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
be30: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
be40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
be50: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
be60: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
be70: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
be80: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
be90: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
bea0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
beb0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
bec0: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
bed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bee0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
bf00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bf10: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
bf20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bf30: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bf40: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bf50: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bf60: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
bf70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bf80: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bf90: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bfa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bfb0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bfc0: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bfd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
bfe0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bff0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c000: 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20  pPager)); */.   
c010: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c020: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  OK ) goto end_pl
c030: 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f  ayback;.  .    /
c040: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
c050: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
c060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
c070: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
c080: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
c090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c0a0: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
c0b0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
c0c0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
c0d0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
c0e0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
c0f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c100: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
c110: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
c120: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c140: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
c150: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
c160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c170: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c180: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
c190: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c1b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
c1c0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
c1d0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
c1e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
c1f0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
c200: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
c210: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
c220: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
c230: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
c240: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
c250: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
c260: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
c270: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
c280: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
c290: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
c2a0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
c2b0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
c2c0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
c2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c2e0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c2f0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
c300: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
c310: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
c320: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
c330: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
c340: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
c350: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
c360: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
c370: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
c380: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
c390: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
c3a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c3c0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
c3d0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
c3e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c3f0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c400: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
c410: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
c420: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
c430: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
c440: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
c450: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
c460: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
c470: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c480: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c490: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c4a0: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c4b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c4c0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c4d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c4e0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c4f0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c500: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c520: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c530: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c540: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c550: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c560: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c570: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c580: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c590: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c5a0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c5b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c5d0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c5e0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c5f0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c600: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c610: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c620: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c630: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c650: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c660: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c670: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c680: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c690: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c6a0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c6b0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c6c0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c6d0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c6e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c6f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c700: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c710: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c720: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c750: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c760: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c770: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c790: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c7a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c7c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c7d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c7e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c7f0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c800: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c810: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c820: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c830: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c840: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
c850: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c870: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
c880: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
c890: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
c8a0: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
c8b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
c8c0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c8d0: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
c8e0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
c8f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
c900: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
c910: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
c920: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
c930: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
c940: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
c950: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
c960: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
c970: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
c980: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
c990: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
c9a0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
c9b0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
c9c0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
c9d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
c9e0: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
c9f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ca00: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ca10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
ca20: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
ca30: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
ca40: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
ca50: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
ca60: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
ca70: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
ca80: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
ca90: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
caa0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
cab0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
cac0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
cad0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
cae0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
caf0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
cb00: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
cb10: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
cb20: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
cb30: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
cb40: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
cb50: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
cb60: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
cb70: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
cb80: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
cb90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cba0: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
cbb0: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
cbc0: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
cbd0: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
cbe0: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
cbf0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
cc00: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
cc10: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
cc20: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
cc30: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
cc40: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
cc50: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
cc60: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
cc70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
cc80: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc90: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cca0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
ccb0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
ccc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
ccd0: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
cce0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
ccf0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cd00: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
cd10: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
cd20: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
cd30: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
cd40: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
cd50: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
cd60: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
cd70: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
cd80: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
cd90: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
cda0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
cdb0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
cdc0: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
cdd0: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
cde0: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
cdf0: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
ce00: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
ce10: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
ce20: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
ce30: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
ce40: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
ce50: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
ce60: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
ce70: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
ce80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ce90: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
cea0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ceb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
cec0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ced0: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
cee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
cef0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
cf00: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
cf10: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
cf20: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65  tmtCksum;.  asse
cf30: 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  rt( JOURNAL_HDR_
cf40: 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67  SZ(pPager)<(pPag
cf50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20  er->pageSize+8) 
cf60: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  );.  while( pPag
cf70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
cf80: 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65  = (hdrOff-(pPage
cf90: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20  r->pageSize+8)) 
cfa0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cfb0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cfc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
cfd0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
cfe0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
cff0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d000: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d010: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d020: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d030: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d040: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d050: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52  zJ ){.    u32 nR
d060: 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d  ec;.    u32 dumm
d070: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d080: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d090: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
d0a0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
d0b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d0c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d0d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d0e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
d0f0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
d110: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
d120: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
d130: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
d140: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
d150: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
d160: 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b     for(i=nRec-1;
d170: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
d180: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d190: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
d1a0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d1b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d1c0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
d1d0: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
d1e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d1f0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
d200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d210: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d220: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
d230: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
d240: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
d250: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
d260: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
d270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d280: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
d290: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
d2a0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
d2b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
d2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d2d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d2e0: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d2f0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d300: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d320: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d330: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d340: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d350: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d360: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d370: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
d380: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
d390: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
d3a0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
d3b0: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
d3c0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
d3d0: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
d3e0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d3f0: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
d400: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
d410: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
d420: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
d430: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
d440: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
d450: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
d460: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
d470: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
d480: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
d490: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d4a0: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
d4b0: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
d4c0: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
d4d0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
d4e0: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
d4f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
d500: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
d510: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
d520: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
d530: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
d540: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
d550: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d560: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
d570: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d580: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d590: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d5a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
d5b0: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
d5c0: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
d5d0: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
d5e0: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
d5f0: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
d600: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
d610: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
d620: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
d630: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
d640: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
d650: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
d660: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
d670: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
d680: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d690: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
d6a0: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
d6b0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
d6c0: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
d6d0: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d6e0: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
d6f0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d700: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d710: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d720: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
d730: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d740: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
d750: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
d760: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
d770: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
d780: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
d790: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
d7b0: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
d7c0: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
d7d0: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
d7e0: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
d7f0: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
d800: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
d810: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
d820: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
d830: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
d840: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
d850: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
d860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d870: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
d880: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
d890: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
d8a0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
d8b0: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
d8c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d8d0: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
d8e0: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
d8f0: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
d900: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d910: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d920: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
d930: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
d940: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
d950: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
d960: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
d970: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
d980: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
d990: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
d9a0: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
d9b0: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
d9c0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
d9d0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d9e0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d9f0: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
da00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
da10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
da20: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
da30: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
da40: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
da50: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
da60: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
da70: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
da80: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
da90: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
daa0: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
dab0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
dac0: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
dad0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
dae0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
daf0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
db00: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
db10: 46 69 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d  File.** (zFile m
db20: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
db30: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
db40: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
db50: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
db60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
db70: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
db80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
db90: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
dba0: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
dbb0: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
dbc0: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
dbd0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
dbe0: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
dbf0: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
dc00: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
dc10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
dc20: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
dc30: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
dc40: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
dc50: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
dc60: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
dc70: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
dc80: 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
dc90: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
dca0: 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20  lysis only */.  
dcb0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
dcc0: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 54 65     sqlite3Os.xTe
dcd0: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
dce0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
dcf0: 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63 6c 75  te3Os.xOpenExclu
dd00: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
dd10: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
dd20: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
dd30: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
dd40: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
dd50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dd60: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
dd70: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
dd80: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
dd90: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
dda0: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
ddb0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
ddc0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
ddd0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
dde0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
ddf0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
de00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
de10: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
de20: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
de30: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
de40: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
de50: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
de60: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
de70: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
de80: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
de90: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
dea0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
deb0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
dec0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
ded0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
dee0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
def0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
df00: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
df10: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
df20: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
df30: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
df40: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
df50: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
df60: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
df70: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
df80: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
df90: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
dfa0: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
dfb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
dfc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
dfd0: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
dfe0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
dff0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
e000: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e010: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
e020: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e030: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
e040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e050: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
e060: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
e070: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e080: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
e090: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
e0a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
e0b0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e0c0: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
e0d0: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
e0e0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
e0f0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
e100: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
e110: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
e120: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
e130: 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *fd;.  int rc =
e140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e150: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
e160: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
e170: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
e180: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
e190: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
e1a0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
e1b0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
e1c0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
e1d0: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
e1e0: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
e1f0: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
e200: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
e210: 45 5f 53 49 5a 45 5d 3b 0a 20 20 53 71 6c 69 74  E_SIZE];.  Sqlit
e220: 65 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71 6c  eTsd *pTsd = sql
e230: 69 74 65 33 54 73 64 28 29 3b 0a 0a 20 20 2f 2a  ite3Tsd();..  /*
e240: 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73   If malloc() has
e250: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20   already failed 
e260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e270: 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e  MEM. Before even
e280: 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f  .  ** testing fo
e290: 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50  r this, set *ppP
e2a0: 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20  ager to NULL so 
e2b0: 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73  the caller knows
e2c0: 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
e2d0: 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65  structure was ne
e2e0: 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a  ver allocated. .
e2f0: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20    */.  *ppPager 
e300: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
e310: 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46  e3Tsd()->mallocF
e320: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
e330: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e340: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e350: 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64  fd, 0, sizeof(fd
e360: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ));..  /* Open t
e370: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
e380: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
e390: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
e3a0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
e3b0: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
e3c0: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
e3d0: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
e3e0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
e3f0: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
e400: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
e410: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
e420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e430: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e440: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
e450: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
e460: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
e470: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
e480: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e490: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
e4a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
e4b0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
e4c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e4d0: 71 6c 69 74 65 33 4f 73 2e 78 46 75 6c 6c 50 61  qlite3Os.xFullPa
e4e0: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
e4f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
e500: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
e510: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e520: 65 33 4f 73 2e 78 4f 70 65 6e 52 65 61 64 57 72  e3Os.xOpenReadWr
e530: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
e540: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
e550: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
e560: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
e570: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
e580: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
e590: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
e5a0: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
e5b0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e5c0: 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 75 6c  = sqlite3Os.xFul
e5d0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
e5e0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
e5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e600: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
e610: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
e630: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
e640: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
e650: 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  same allocation,
e660: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   allocate.  ** s
e670: 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c  pace for the ful
e680: 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66  l paths of the f
e690: 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61  ile, directory a
e6a0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  nd journal .  **
e6b0: 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d   (Pager.zFilenam
e6c0: 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  e, Pager.zDirect
e6d0: 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ory and Pager.zJ
e6e0: 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20  ournal)..  */.  
e6f0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e700: 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e  e ){.    nameLen
e710: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e720: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50  athname);.    pP
e730: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
e740: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
e750: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
e760: 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20 20   + 30 );.  }..  
e770: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
e780: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
e790: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
e7a0: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
e7b0: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
e7c0: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
e7d0: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
e7e0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e7f0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
e800: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
e810: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
e820: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
e830: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
e840: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
e850: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
e860: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
e870: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
e880: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
e890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
e8b0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
e8c0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
e8d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
e8e0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
e8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
e900: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
e910: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
e920: 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50   }..  TRACE3("OP
e930: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
e940: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a  EHANDLEID(fd), z
e950: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e960: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
e970: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
e980: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
e990: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
e9a0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
e9b0: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
e9c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e9d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
e9e0: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
e9f0: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
ea00: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
ea10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ea20: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
ea30: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
ea40: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66  lPathname);..  f
ea50: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
ea60: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
ea70: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
ea80: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
ea90: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
eaa0: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
eab0: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
eac0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
ead0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eae0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
eaf0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
eb00: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
eb10: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
eb20: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
eb30: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
eb40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
eb50: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  lOpen = 0;.  pPa
eb60: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
eb70: 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
eb80: 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
eb90: 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
eba0: 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
ebb0: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
ebc0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
ebd0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
ebe0: 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  se = 0;.  pPager
ebf0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50  ->nRef = 0;.  pP
ec00: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
ec10: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
ec20: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
ec30: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
ec40: 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d  _SIZE;.  pPager-
ec50: 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20  >stmtSize = 0;. 
ec60: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
ec70: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
ec80: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
ec90: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
eca0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
ecb0: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
ecc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
ecd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
ece0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
ecf0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   0;.  pPager->te
ed00: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
ed10: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
ed20: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
ed30: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
ed40: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61   readOnly;.  pPa
ed50: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
ed60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  0;.  pPager->noS
ed70: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
ed80: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
ed90: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
eda0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
edb0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
edc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
edd0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
ede0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
edf0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
ee00: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
ee10: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
ee20: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
ee30: 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ra);.  pPager->s
ee40: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
ee50: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
ee60: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
ee70: 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d  ndler = 0;.  mem
ee80: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
ee90: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
eea0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
eeb0: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
eec0: 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  r;.  pPager->pNe
eed0: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
eee0: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
eef0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
ef00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ef10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ef20: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
ef30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
ef40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ef50: 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  _busyhandler(Pag
ef60: 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
ef70: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
ef80: 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
ef90: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
efa0: 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
efb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
efc0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
efd0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
efe0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
eff0: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
f000: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
f010: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
f020: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
f030: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
f040: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
f050: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
f060: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
f070: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
f080: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
f090: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
f0a0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
f0b0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
f0c0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
f0d0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
f0e0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
f0f0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
f100: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
f110: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
f120: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
f130: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
f140: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f150: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
f160: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
f170: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
f180: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
f190: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
f1a0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
f1b0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
f1c0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
f1d0: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
f1e0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
f1f0: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
f200: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
f210: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
f220: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
f230: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
f240: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
f250: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
f260: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
f270: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
f280: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
f290: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
f2a0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
f2b0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
f2c0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
f2d0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
f2e0: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
f2f0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
f300: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
f310: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
f320: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
f330: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
f340: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
f350: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
f360: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
f370: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
f380: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
f390: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
f3a0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
f3b0: 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
f3c0: 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
f3d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f3e0: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
f3f0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
f400: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
f410: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
f420: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f430: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f440: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
f450: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
f460: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
f470: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
f480: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65  geSize;.  }.  re
f490: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
f4a0: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
f4b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
f4c0: 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
f4d0: 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
f4e0: 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
f4f0: 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
f500: 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
f510: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
f520: 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
f530: 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
f540: 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
f550: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
f560: 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
f570: 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
f580: 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
f590: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
f5a0: 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
f5b0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
f5c0: 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
f5d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
f5e0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
f5f0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f600: 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
f610: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
f620: 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
f630: 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63  aved_cnt;.void c
f640: 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69  lear_simulated_i
f650: 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c  o_error(){.  sql
f660: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
f670: 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69  t = 0;.}.void di
f680: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f690: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f6a0: 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
f6b0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f6c0: 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
f6d0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f6e0: 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
f6f0: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f700: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
f710: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
f720: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
f730: 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
f740: 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61  se.# define clea
f750: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
f760: 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20  rror().# define 
f770: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
f780: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
f790: 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
f7a0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f7b0: 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
f7c0: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f7d0: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
f7e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
f7f0: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
f800: 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
f810: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
f820: 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
f830: 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
f840: 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
f850: 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
f860: 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
f870: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
f880: 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
f890: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
f8a0: 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
f8b0: 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
f8c0: 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
f8d0: 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
f8e0: 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
f8f0: 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
f900: 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
f910: 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
f920: 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
f930: 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
f940: 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
f950: 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
f960: 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
f970: 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
f980: 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
f990: 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  his)..*/.void sq
f9a0: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f  lite3pager_read_
f9b0: 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  fileheader(Pager
f9c0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
f9d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f9e0: 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74  pDest){.  memset
f9f0: 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
fa00: 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
fa10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
fa20: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
fa30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
fa40: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
fa50: 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20   pDest, N);.    
fa60: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
fa70: 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  io_error();.  }.
fa80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fa90: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
faa0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
fab0: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
fac0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
fad0: 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
fae0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
faf0: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
fb00: 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
fb10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
fb20: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
fb30: 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
fb40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
fb50: 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
fb60: 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
fb70: 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
fb80: 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
fb90: 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
fba0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
fbb0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
fbc0: 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
fbd0: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
fbe0: 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
fbf0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
fc00: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
fc10: 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61  r){.  i64 n;.  a
fc20: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
fc30: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
fc40: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
fc50: 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
fc60: 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
fc70: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
fc80: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
fc90: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
fca0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fcb0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
fcc0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  |= PAGER_ERR_DIS
fcd0: 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  K;.      return 
fce0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
fcf0: 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
fd00: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
fd10: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
fd20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
fd30: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fd40: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fd50: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
fd60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
fd70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
fd80: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
fd90: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
fda0: 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
fdb0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
fdc0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72      n++;.  }.  r
fdd0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
fde0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
fdf0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
fe00: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
fe10: 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  Pager*);.../*.**
fe20: 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
fe30: 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
fe40: 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
fe50: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
fe60: 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
fe70: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
fe80: 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
fe90: 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
fea0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
feb0: 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
fec0: 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
fed0: 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
fee0: 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
fef0: 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
ff00: 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
ff10: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
ff20: 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
ff30: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
ff40: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
ff50: 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
ff60: 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
ff70: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
ff80: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  o==0 ){.    /* I
ff90: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
ffa0: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  r is zero, then 
ffb0: 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74  this page is not
ffc0: 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61   in any hash cha
ffd0: 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  in. */.    retur
ffe0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
fff0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
10000 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
10010 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
10020 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
10030 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
10040 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
10050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
10060 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
10070 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67  pPg->pgno)]!=pPg
10080 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
10090 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
100a0 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
100b0 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
100c0 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68   int h = pager_h
100d0 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ash(pPg->pgno);.
100e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
100f0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50  er->aHash[h]==pP
10100 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
10110 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
10120 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
10130 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
10140 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
10150 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
10160 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
10170 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
10180 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
10190 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
101a0 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
101b0 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
101c0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
101d0 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
101e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
101f0 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
10200 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
10210 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
10220 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
10230 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
10240 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
10250 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
10260 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
10270 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
10280 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10290 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
102a0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
102b0 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
102c0 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
102d0 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
102e0 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
102f0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10300 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
10310 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
10320 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
10330 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
10340 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
10350 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
10360 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
10370 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10390 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
103a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
103b0 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
103c0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
103d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
103e0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
103f0 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
10400 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
10410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10420 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
10430 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
10440 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
10450 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10460 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
10470 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
10480 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
10490 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
104a0 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
104b0 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
104c0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
104d0 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Pg);.}..#ifndef 
104e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
104f0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RYDB./*.** This 
10500 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
10510 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69  to truncate an i
10520 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10530 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c  e.  Delete.** al
10540 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
10550 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  no is larger tha
10560 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
10570 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
10580 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e  nced..** Referen
10590 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
105a0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
105b0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
105c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
105d0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50  memoryTruncate(P
105e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
105f0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
10600 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
10610 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
10620 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
10630 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
10640 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
10650 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
10660 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
10670 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
10680 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
10690 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
106a0 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
106b0 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
106c0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
106d0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
106e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
106f0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
10700 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
10720 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
10730 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  All;.      unlin
10740 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
10750 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
10760 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
10770 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
10780 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
10790 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
107a0 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
107b0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
107c0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
107d0 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
107e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
107f0 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
10800 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
10810 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
10820 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
10830 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
10840 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
10850 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
10860 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
10870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10880 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
10890 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
108a0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
108b0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
108c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
108d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
108e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
108f0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
10900 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  rc;.  assert( PA
10910 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
10920 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
10930 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
10940 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
10950 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10960 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
10970 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
10980 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10990 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
109a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
109b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
109c0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
109d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
109e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
109f0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
10a00 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10a10 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
10a20 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
10a30 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
10a40 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
10a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10a60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10a70 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
10a80 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
10a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10aa0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
10ab0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
10ac0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
10ad0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
10ae0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
10af0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
10b00 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
10b10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10b20 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
10b30 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
10b40 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
10b50 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
10b60 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
10b70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10b80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
10b90 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
10ba0 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
10bb0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10bd0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
10be0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10bf0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
10c00 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
10c10 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
10c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10c30 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
10c40 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
10c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10c70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
10c80 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10c90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10ca0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
10cb0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
10cc0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10cd0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
10ce0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
10cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10d10 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
10d20 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
10d30 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
10d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10d50 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10d60 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10d80 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
10d90 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
10da0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
10db0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
10dc0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
10dd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
10de0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
10df0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
10e10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10e20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
10e30 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
10e40 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
10e50 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
10e60 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
10e70 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
10e80 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
10e90 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
10ea0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
10eb0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
10ec0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
10ed0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
10ee0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
10ef0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
10f00 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
10f10 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
10f20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10f30 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
10f40 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
10f50 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
10f60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
10f70 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
10f80 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
10f90 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
10fa0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
10fb0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
10fc0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
10fd0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
10fe0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10ff0 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
11000 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11010 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66  pPg, *pNext;.#if
11020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11030 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11040 4e 54 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a  NT.  SqliteTsd *
11050 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73  pTsd = sqlite3Ts
11060 64 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  d();.#endif..  s
11070 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
11080 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
11090 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
110a0 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
110b0 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73  SYNCED: .    cas
110c0 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
110d0 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  E: {.      /* We
110e0 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   ignore any IO e
110f0 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72  rrors that occur
11100 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
11110 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70  back.      ** op
11120 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61  eration. So disa
11130 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d  ble IO error sim
11140 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  ulation so that 
11150 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  testing.      **
11160 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69   works more easi
11170 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
11180 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
11190 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
111a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  ;.      sqlite3p
111b0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
111c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 65 6e 61  ager);.      ena
111d0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
111e0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20  _errors();.     
111f0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
11200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11210 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
11220 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
11230 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
11240 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  t( pPager->errMa
11250 73 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  sk || pPager->jo
11260 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
11270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11280 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45   }.    case PAGE
11290 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20  R_SHARED: {.    
112a0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
112b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
112c0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
112d0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
112e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
112f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
11300 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
11310 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
11320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11330 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  }.  }.  for(pPg=
11340 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
11350 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23  g; pPg=pNext){.#
11360 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11370 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
11380 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
11390 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
113a0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
113b0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
113c0 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
113d0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
113e0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
113f0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
11400 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
11410 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
11420 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d  ndif.    pNext =
11430 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
11440 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11450 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  Pg);.  }.  TRACE
11460 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
11470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11490 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 28  er->errMask || (
114a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
114b0 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
114c0 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
114d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
114e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
11520 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
11530 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
11540 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
11550 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11560 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
11570 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11580 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
11590 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
115a0 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
115b0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
115c0 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
115d0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
115e0 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
115f0 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65  qlite3Os.xDelete
11600 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
11610 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
11620 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11630 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
11640 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
11650 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
11660 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
11670 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
11680 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 53  rting at .  ** S
11690 71 6c 69 74 65 54 73 64 2e 70 50 61 67 65 72 2e  qliteTsd.pPager.
116a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
116b0 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
116c0 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
116d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
116e0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
116f0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
11700 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
11710 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
11720 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
11730 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
11740 78 74 29 3b 0a 20 20 20 20 70 54 6d 70 2d 3e 70  xt);.    pTmp->p
11750 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
11760 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
11770 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ..  sqliteFree(p
11780 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
11790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
117a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
117b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
117c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
117d0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
117e0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
117f0 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
11800 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
11810 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11820 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
11830 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
11840 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
11850 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
11860 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
11870 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
11880 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
11890 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
118a0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
118b0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
118c0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
118d0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
118e0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
118f0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
11900 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
11910 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
11920 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
11930 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
11940 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
11950 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
11960 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
11970 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
11980 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
11990 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
119a0 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
119b0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
119c0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
119d0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
119e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
119f0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
11a00 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
11a10 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
11a20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
11a30 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
11a40 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
11a50 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
11a60 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
11a70 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
11a80 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
11a90 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11aa0 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11ab0 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11ac0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
11ad0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
11ae0 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
11af0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
11b00 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
11b10 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
11b20 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
11b30 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
11b40 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
11b50 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
11b60 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11b70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
11b80 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
11b90 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
11ba0 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
11bb0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bd0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
11be0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
11bf0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
11c00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
11c10 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
11c20 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
11c30 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
11c40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11c50 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11c60 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
11c70 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
11c80 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
11c90 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
11ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11cb0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
11cc0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
11cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
11ce0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
11cf0 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
11d00 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
11d10 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
11d20 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
11d30 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
11d40 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
11d50 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
11d60 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
11d70 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
11d80 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
11d90 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
11da0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
11db0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11dc0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
11dd0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11de0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11e00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
11e10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
11e20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11e30 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
11e40 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
11e50 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
11e60 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
11e70 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
11e80 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
11e90 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
11ea0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
11eb0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
11ec0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11ed0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
11ee0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
11ef0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
11f00 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
11f10 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11f20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
11f30 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
11f40 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
11f50 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
11f60 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
11f70 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
11f80 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
11f90 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
11fa0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
11fb0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
11fc0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11fd0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
11fe0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
11ff0 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
12000 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12010 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
12020 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
12030 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
12040 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
12050 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
12060 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
12070 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
12080 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12090 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
120a0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
120b0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
120c0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
120d0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
120e0 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
120f0 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
12100 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
12110 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
12120 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12130 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12140 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
12150 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
12160 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
12170 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
12180 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
12190 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
121a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
121b0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
121c0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
121d0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
121e0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
121f0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
12200 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
12210 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12220 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
12230 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12240 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
12250 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
12260 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
12270 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
12280 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
12290 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
122a0 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
122b0 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
122c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
122d0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
122e0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
122f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
12300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
12310 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
12320 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
12330 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
12340 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
12350 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
12360 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
12370 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
12380 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
12390 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
123a0 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
123b0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
123c0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
123d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
123e0 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
123f0 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
12400 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
12410 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
12420 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
12430 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
12440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12450 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12460 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
12470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12480 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12490 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
124a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
124b0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
124c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
124d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
124e0 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
124f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
12500 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
12510 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
12520 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
12530 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
12540 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
12550 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
12560 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
12570 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
12580 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
12590 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
125a0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
125b0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
125c0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
125d0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
125e0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
125f0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
12600 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
12610 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12620 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
12640 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12650 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12660 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
12680 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
12690 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
126a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
126b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
126c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
126d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
126e0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  ek(pPager->jfd,.
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
12710 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
12720 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
12730 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
12740 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12750 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
12760 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
12770 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
12780 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
12790 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
127a0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
127b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
127c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
127d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
127e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
127f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
12810 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12820 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12830 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12850 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12860 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
12870 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  Sync);.      if(
12880 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
12890 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
128a0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
128b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
128c0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
128d0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
128e0 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
128f0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
12900 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
12910 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
12920 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
12930 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
12940 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
12950 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
12960 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
12970 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
12980 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
12990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
129a0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
129b0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
129c0 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
129d0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
129e0 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
129f0 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
12a00 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
12a10 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
12a20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
12a30 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
12a40 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
12a50 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12a60 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12a70 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
12a80 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
12a90 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
12aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12ab0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
12ac0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
12ad0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12ae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12af0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
12b00 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
12b10 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
12b20 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
12b30 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
12b40 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
12b50 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
12b60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12b70 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
12b80 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
12b90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12ba0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
12bb0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
12bc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
12bd0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12be0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
12bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
12c00 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
12c10 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
12c20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
12c30 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
12c40 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
12c50 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
12c60 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12c70 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
12c80 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
12c90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
12ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
12cb0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12cc0 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
12cd0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
12ce0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
12cf0 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
12d00 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
12d10 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
12d20 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
12d30 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
12d40 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
12d50 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
12d60 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
12d70 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
12d80 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
12d90 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
12da0 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
12db0 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
12dc0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
12dd0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
12de0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
12df0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
12e00 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
12e10 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
12e20 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
12e30 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
12e40 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
12e50 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
12e60 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
12e70 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12e80 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
12e90 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
12ea0 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
12eb0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
12ec0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
12ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
12ee0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12ef0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
12f00 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
12f10 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
12f20 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
12f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
12f40 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
12f50 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
12f60 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
12f70 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
12f80 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
12f90 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
12fa0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
12fb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
12fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12fd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12fe0 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  rc;.  }..  while
12ff0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
13000 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
13010 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rty );.    rc = 
13020 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13030 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
13040 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
13050 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13060 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
13070 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a  eturn rc;.    /*
13080 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
13090 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
130a0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
130b0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
130c0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
130d0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
130e0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
130f0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
13100 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
13110 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
13120 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
13130 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
13140 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
13150 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
13160 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
13170 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
13180 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13190 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
131a0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
131b0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
131c0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
131d0 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
131e0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
131f0 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
13200 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
13210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
13220 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
13230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13240 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13250 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
13260 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
13290 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44  Size);.      COD
132a0 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
132b0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
132c0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29   pList->pgno, 0)
132d0 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
132e0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
132f0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
13300 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
13310 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  {.      TRACE3("
13320 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
13330 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13340 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13350 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gno);.    }.#end
13360 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  if.    if( rc ) 
13370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
13380 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
13390 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
133a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
133b0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
133c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
133d0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
133e0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
133f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
13400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
13420 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
13430 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
13440 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
13450 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13460 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
13470 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
13480 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
13490 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
134a0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
134b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
134c0 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
134d0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
134e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
134f0 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74  PgHdr *p, *pList
13500 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ;.  pList = 0;. 
13510 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
13520 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
13530 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
13540 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
13550 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c    p->pDirty = pL
13560 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  ist;.      pList
13570 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
13580 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
13590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
135a0 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
135b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
135c0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
135d0 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
135e0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
135f0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
13600 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
13610 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
13620 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
13630 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
13640 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
13650 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
13660 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
13670 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
13680 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
13690 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
136a0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
136b0 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
136c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
136d0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
136e0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
136f0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
13700 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
13710 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
13720 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 2e 78  if( !sqlite3Os.x
13730 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
13740 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72  r->zJournal) ) r
13750 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
13760 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
13770 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
13780 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30  ->fd) ) return 0
13790 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 70  ;.  if( sqlite3p
137a0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
137b0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
137c0 20 73 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65   sqlite3Os.xDele
137d0 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
137e0 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
137f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
13800 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
13810 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
13820 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
13830 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
13840 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
13850 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13860 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
13870 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
13880 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
13890 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
138a0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
138b0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 76 61 72  ger->errMask var
138c0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
138d0 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
138e0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
138f0 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67  , int syncOk, Pg
13900 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
13910 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
13920 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  Pg = 0;..  /* Fi
13930 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
13940 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
13950 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
13960 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
13970 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
13980 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
13990 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
139a0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
139b0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
139c0 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
139d0 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
139e0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
139f0 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
13a00 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75  .  ** on the jou
13a10 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
13a20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
13a30 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
13a40 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77  a.  ** very slow
13a50 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
13a60 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
13a70 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
13a80 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20  metimes.  ** it 
13a90 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
13aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  .  */.  if( pPg=
13ab0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
13ac0 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26  irst && syncOk &
13ad0 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69  & !MEMDB){.    i
13ae0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
13af0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
13b00 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
13b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13b20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13b30 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
13b40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
13b50 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
13b60 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
13b70 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
13b80 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
13b90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
13ba0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
13bb0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
13bc0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
13bd0 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
13be0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
13bf0 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
13c00 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
13c10 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
13c20 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
13c30 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
13c40 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
13c50 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
13c60 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
13c70 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13c80 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
13c90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
13ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13cc0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
13cd0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
13ce0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
13d10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13d20 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
13d30 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
13d40 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
13d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13d70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
13d80 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
13d90 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
13da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13db0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
13dc0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
13dd0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
13de0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
13df0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
13e00 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  c==0 );.    pPg-
13e10 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
13e20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
13e30 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
13e40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13e70 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
13e80 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
13e90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
13ea0 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
13eb0 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
13ec0 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
13ed0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
13ee0 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
13ef0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
13f00 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
13f10 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64  he.  ** sqlite_d
13f20 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
13f30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
13f40 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
13f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13f60 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
13f70 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
13f80 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
13f90 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
13fa0 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
13fb0 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
13fc0 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
13fd0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
13fe0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
13ff0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
14000 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
14010 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
14020 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
14030 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
14040 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
14050 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
14060 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
14070 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
14080 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
14090 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
140a0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
140b0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
140c0 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
140d0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
140e0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
140f0 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
14100 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f  ge(pPg);.  TEST_
14110 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76  INCR(pPager->nOv
14120 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  fl);..  *ppPg = 
14130 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
14140 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14150 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14160 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65  is called to fre
14170 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79  e superfluous dy
14180 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
14190 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65  ted memory.** he
141a0 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ld by the pager 
141b0 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69  system. Memory i
141c0 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c  n use by any SQL
141d0 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61  ite pager alloca
141e0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  ted.** by the cu
141f0 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79  rrent thread may
14200 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29   be sqliteFree()
14210 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
14220 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
14230 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
14240 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
14250 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
14260 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
14270 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
14280 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20  rns. A negative 
14290 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d  value for nReq m
142a0 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20  eans.** free as 
142b0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
142c0 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74  ossible. The ret
142d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
142e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
142f0 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
14300 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
14310 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14320 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
14330 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
14340 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
14350 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  _memory(int nReq
14360 29 7b 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a  ){.  SqliteTsd *
14370 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73  pTsd = sqlite3Ts
14380 64 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  d();.  Pager *p;
14390 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
143a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
143b0 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c    /* Outermost l
143c0 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20  oop runs for at 
143d0 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69  most two iterati
143e0 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61  ons. First itera
143f0 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79  tion we.  ** try
14400 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20   to find memory 
14410 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65  that can be rele
14420 61 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c  ased without cal
14430 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65  ling fsync(). Se
14440 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74  cond.  ** iterat
14450 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20  ion (which only 
14460 72 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73  runs if the firs
14470 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65  t failed to free
14480 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20   nReq bytes of. 
14490 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70   ** memory) is p
144a0 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c  ermitted to call
144b0 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69   fsync(). This i
144c0 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68  s of course much
144d0 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65   more .  ** expe
144e0 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nsive..  */.  fo
144f0 72 28 69 3d 30 3b 20 69 3d 3d 30 20 7c 7c 20 69  r(i=0; i==0 || i
14500 3d 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  ==1; i++){..    
14510 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
14520 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
14530 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
14540 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
14550 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
14560 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70  =pTsd->pPager; p
14570 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
14580 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20  Released<nReq); 
14590 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
145a0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
145b0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
145c0 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20      /* For each 
145d0 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72  pager, try to fr
145e0 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73  ee as many pages
145f0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69   as possible (wi
14600 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  thout .      ** 
14610 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20  calling fsync() 
14620 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
14630 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
14640 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
14650 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e  .      ** loop).
14660 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14670 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b  while( SQLITE_OK
14680 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65  ==(rc = pager_re
14690 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67  cycle(p, i, &pPg
146a0 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20  )) && pPg) {.   
146b0 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f       /* We've fo
146c0 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72  und a page to fr
146d0 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  ee. At this poin
146e0 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  t the page has b
146f0 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  een .        ** 
14700 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
14710 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
14720 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
14730 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
14740 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
14750 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
14760 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
14770 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
14780 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  . .        ** Re
14790 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69  move it from thi
147a0 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72  s list before fr
147b0 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  eeing..        *
147c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64  *.        ** Tod
147d0 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
147e0 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
147f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
14800 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
14810 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
14820 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
14830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48    */.        PgH
14840 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  dr *pTmp;.      
14850 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
14860 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 72 65  .        page_re
14870 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
14880 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
14890 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41    if( pPg==p->pA
148a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
148b0 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e   p->pAll = pPg->
148c0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
148d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
148e0 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e     for( pTmp=p->
148f0 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
14900 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
14910 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
14920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70  ;.          pTmp
14930 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
14940 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
14950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52      }.        nR
14960 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74  eleased += sqlit
14970 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b  eAllocSize(pPg);
14980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
14990 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
149a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
149b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
149c0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
149d0 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
149e0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
149f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
14a00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75   .        ** jou
14a10 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
14a20 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
14a30 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
14a40 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
14a50 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20     ** caller of 
14a60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
14a70 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20  nstead, set the 
14a80 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
14a90 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  riable..        
14aa0 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c  ** The error wil
14ab0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
14ac0 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73   the user (or us
14ad0 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65  ers, in the case
14ae0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20   .        ** of 
14af0 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63  a shared pager c
14b00 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67  ache) of the pag
14b10 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
14b20 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a   error occured..
14b30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14b40 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
14b50 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
14b60 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
14b70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14b80 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
14b90 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
14ba0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
14bb0 72 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  r(p, rc);.      
14bc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
14bd0 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b  eturn nReleased;
14be0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
14bf0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
14c00 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
14c10 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
14c20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
14c30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
14c40 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
14c50 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
14c60 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
14c70 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
14c80 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
14c90 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
14ca0 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
14cb0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20  d..**.** A _get 
14cc0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
14cd0 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
14ce0 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
14cf0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
14d00 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
14d10 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
14d20 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
14d30 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
14d40 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
14d50 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
14d60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
14d70 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
14d80 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
14d90 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
14da0 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
14db0 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
14dc0 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
14dd0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
14de0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
14df0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
14e00 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
14e10 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
14e20 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
14e30 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
14e40 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
14e50 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
14e60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
14e70 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
14e80 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
14e90 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
14ea0 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  er_lookup().  Bo
14eb0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
14ec0 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74  and _lookup() at
14ed0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
14ee0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
14ef0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
14f00 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
14f10 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
14f20 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
14f30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
14f40 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
14f50 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
14f60 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
14f70 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
14f80 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
14f90 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
14fa0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
14fb0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
14fc0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
14fd0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
14fe0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
14ff0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
15000 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
15010 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
15020 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
15030 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
15040 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
15050 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
15060 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
15070 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15080 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
15090 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48  **ppPage){.  PgH
150a0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
150b0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  c;..  /* The max
150c0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
150d0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
150e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
150f0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
15100 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
15110 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
15120 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
15130 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
15140 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
15150 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
15160 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
15170 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
15190 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
151a0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
151b0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
151c0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
151d0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
151e0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
151f0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
15200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
15210 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
15220 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
15230 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15240 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
15250 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
15260 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
15270 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
15280 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
15290 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
152a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
152b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
152c0 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
152d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20  EMDB ){.    if( 
152e0 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
152f0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
15300 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
15310 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
15320 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
15330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15350 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
15360 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15380 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
15390 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
153a0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
153b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
153c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
153d0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
153e0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
153f0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
15400 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
15410 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
15420 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
15430 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
15440 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
15450 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
15460 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15470 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
15480 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
15490 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
154a0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
154b0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
154c0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
154d0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
154e0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
154f0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
15500 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
15510 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
15520 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
15530 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
15540 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
15550 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
15560 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
15570 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
15580 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
15590 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
155a0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
155b0 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
155c0 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
155d0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
155e0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
155f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
15600 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
15610 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
15620 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
15630 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
15640 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
15650 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
15660 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
15670 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
15680 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15690 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
156a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
156b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
156c0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
156d0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
156e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
156f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15700 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
15710 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
15720 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
15730 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15740 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
15750 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
15760 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
15770 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
15780 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
15790 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
157a0 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
157b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
157c0 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
157d0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
157e0 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
157f0 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
15800 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
15810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
15820 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
15830 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
15840 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
15850 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
15860 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
15870 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
15880 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
15890 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
158a0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
158b0 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
158c0 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
158d0 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
158e0 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
158f0 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
15900 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
15910 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
15920 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
15930 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
15940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15950 33 4f 73 2e 78 4f 70 65 6e 52 65 61 64 4f 6e 6c  3Os.xOpenReadOnl
15960 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
15970 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
15980 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
15990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
159a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
159b0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
159c0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
159d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
159e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
159f0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
15a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
15a10 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
15a20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a30 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
15a40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a50 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
15a60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15a70 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
15a80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
15a90 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
15aa0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15ab0 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
15ac0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
15ad0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
15ae0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
15af0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
15b00 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
15b10 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
15b20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
15b30 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
15b40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15b50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15b70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
15b80 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
15b90 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15bb0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
15bc0 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
15bd0 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
15be0 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
15bf0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
15c00 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
15c10 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
15c20 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
15c30 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15c40 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15c50 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
15c60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15c70 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
15c80 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
15c90 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
15ca0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
15cb0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
15cc0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
15cd0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
15ce0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
15cf0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
15d00 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
15d10 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
15d20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
15d30 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
15d40 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
15d50 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
15d60 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
15d70 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
15da0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
15db0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
15de0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
15df0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
15e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
15e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15e20 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
15e30 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
15e40 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
15e50 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
15e60 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
15e70 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
15e80 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
15e90 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
15ea0 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
15eb0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
15ec0 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
15ed0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
15ee0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
15ef0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
15f00 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
15f10 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
15f20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15f30 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d  nPage>pPager->nM
15f40 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  axPage ){.      
15f50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15f60 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61  ->nMaxPage==(pPa
15f70 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b  ger->nPage-1) );
15f80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
15f90 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20  >nMaxPage++;.   
15fa0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15fb0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15fc0 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
15fd0 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   1, &pPg);.     
15fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16000 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16010 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16020 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16030 72 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a  rt(pPg) ;.    }.
16040 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
16050 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
16060 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16070 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16080 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16090 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
160a0 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
160b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
160c0 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
160d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
160e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
160f0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16100 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
16110 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
16120 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16130 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
16140 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
16150 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16160 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16170 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
16180 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
16190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
161a0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
161b0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
161c0 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
161d0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
161e0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
161f0 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
16200 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
16210 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
16220 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
16230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16240 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
16250 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
16260 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
16270 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
16280 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
16290 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
162a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
162b0 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72  +;.    h = pager
162c0 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20  _hash(pgno);.   
162d0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
162e0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
162f0 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
16300 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
16310 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
16320 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
16330 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
16340 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
16350 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
16360 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
16370 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
16380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16390 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
163a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
163b0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
163c0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
163d0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
163e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
163f0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
16400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16410 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
16420 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
16430 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
16440 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
16450 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16460 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
16470 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ( sqlite3pager_p
16480 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
16490 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20  <(int)pgno ){.  
164a0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
164b0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
164c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
164d0 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
164e0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
164f0 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44      assert( MEMD
16500 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  B==0 );.      rc
16510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
16520 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
16530 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
16540 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
16580 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
16590 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
165a0 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
165d0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
165e0 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48     TRACE3("FETCH
165f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16600 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16610 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
16620 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
16630 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16640 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
16650 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
16660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16670 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65 53         i64 fileS
16680 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
16690 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
166a0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 26 66  ze(pPager->fd,&f
166b0 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45  ileSize)!=SQLITE
166c0 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
166d0 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d     || fileSize>=
166e0 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67  pgno*pPager->pag
166f0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
16700 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16710 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
16720 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
16730 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
16740 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16750 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rc);.        }el
16760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
16770 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
16780 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  _error();.      
16790 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
167a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
167b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
167c0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
167d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
167e0 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
167f0 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
16800 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
16810 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
16820 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
16830 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
16840 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
16850 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
16860 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
16870 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
16880 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
16890 2f 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  /.    TEST_INCR(
168a0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
168b0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
168c0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
168d0 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
168e0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
168f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16900 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
16910 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
16920 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
16930 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
16940 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
16950 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
16960 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
16970 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
16980 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
16990 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
169a0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
169b0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
169c0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
169d0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
169e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
169f0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  d sqlite3pager_g
16a00 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
16a10 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
16a20 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
16a30 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
16a40 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
16a50 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
16a60 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
16a70 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
16a80 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
16a90 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
16aa0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
16ab0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
16ac0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
16ad0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67  void *sqlite3pag
16ae0 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
16af0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
16b00 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
16b10 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
16b20 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
16b30 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
16b40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16b50 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
16b60 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
16b70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16b80 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16b90 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16ba0 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
16bb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61  ) return 0;.  pa
16bc0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
16bd0 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
16be0 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
16bf0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
16c00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
16c10 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
16c20 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
16c30 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
16c40 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
16c50 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
16c60 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
16c70 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
16c80 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
16c90 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
16ca0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
16cb0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
16cc0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
16cd0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
16ce0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  t sqlite3pager_u
16cf0 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  nref(void *pData
16d00 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
16d10 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
16d20 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
16d30 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
16d40 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  ge.  */.  pPg = 
16d50 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
16d60 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
16d70 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
16d80 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
16d90 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
16da0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
16db0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
16dc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
16dd0 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
16de0 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
16df0 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
16e00 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
16e10 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
16e20 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
16e30 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
16e40 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
16e50 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
16e60 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
16e70 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
16e80 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
16e90 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
16ea0 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
16eb0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
16ec0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
16ed0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
16ee0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
16ef0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
16f00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16f10 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
16f20 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
16f30 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
16f40 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
16f50 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
16f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
16f70 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
16f80 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
16f90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
16fa0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
16fb0 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
16fc0 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
16fd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16fe0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16ff0 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
17000 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
17010 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
17020 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
17030 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
17040 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17050 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
17060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17070 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
17080 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17090 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44  nRef==0 && !MEMD
170a0 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  B ){.      pager
170b0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
170c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
170d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
170e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
170f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
17100 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
17110 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
17120 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
17130 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
17140 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17150 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
17160 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17170 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
17180 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
17190 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
171a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
171b0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
171c0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
171d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
171e0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
171f0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
17200 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
17210 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
17220 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
17230 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
17240 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
17250 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
17260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17270 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
17280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17290 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
172a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
172b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
172c0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
172d0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
172e0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
172f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
17300 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
17310 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
17320 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
17330 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
17340 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
17350 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17360 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
17370 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
17380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17390 73 2e 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  s.xOpenExclusive
173a0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
173b0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
173c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
173f0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
17400 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
17410 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
17420 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
17430 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
17440 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
17460 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17470 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17480 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
17490 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
174a0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  , pPager->fullSy
174b0 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
174c0 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
174d0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
174e0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
174f0 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
17500 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ory(pPager->jfd,
17510 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
17520 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ory);.  pPager->
17530 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
17540 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
17550 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
17560 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17570 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
17580 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
17590 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
175a0 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
175b0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
175c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
175d0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
175e0 65 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  er);.    goto fa
175f0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
17600 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
17610 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
17620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
17630 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
17640 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
17650 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
17660 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
17670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17680 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17690 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
176a0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
176b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
176c0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
176d0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  E_NOMEM ){.    r
176e0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
176f0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
17700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
17720 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
17730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17740 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
17750 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
17760 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
17770 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
17780 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
17790 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66  ournal = 0;.  if
177a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
177b0 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  EM ){.    /* If 
177c0 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f  this was a mallo
177d0 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65  c() failure, the
177e0 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n we will not be
177f0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
17800 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  er.    ** file. 
17810 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f  So delete any jo
17820 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61  urnal file we ma
17830 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65 61  y have just crea
17840 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ted. Otherwise,.
17850 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65      ** the syste
17860 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75  m will get confu
17870 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20 72  sed, we have a r
17880 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
17890 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a  file and a.    *
178a0 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75  * mysterious jou
178b0 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72 65  rnal has appeare
178c0 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  d in the filesys
178d0 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tem..    */.    
178e0 73 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74  sqlite3Os.xDelet
178f0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
17900 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  al);.  }else{.  
17910 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
17920 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
17930 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
17940 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17950 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  R_UNLOCK;.  }.  
17960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17970 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
17980 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
17990 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
179a0 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
179b0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
179c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
179d0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
179e0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
179f0 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
17a00 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
17a10 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
17a20 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
17a30 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
17a40 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
17a50 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
17a60 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
17a70 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
17a80 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
17a90 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
17aa0 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
17ab0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
17ac0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
17ad0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
17ae0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
17af0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
17b00 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
17b10 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
17b20 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
17b30 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
17b40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17b50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
17b60 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
17b70 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
17b80 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
17b90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17ba0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
17bb0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
17bc0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
17bd0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
17be0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
17bf0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
17c00 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
17c10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
17c20 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
17c30 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
17c40 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
17c50 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
17c60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
17c70 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
17c80 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
17c90 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
17ca0 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
17cb0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
17cc0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
17cd0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
17ce0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
17cf0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
17d00 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
17d10 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
17d20 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
17d30 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
17d40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
17d50 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
17d60 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
17d70 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
17d80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
17d90 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
17da0 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
17db0 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
17dc0 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
17dd0 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
17de0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
17df0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
17e00 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
17e10 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
17e20 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76  te3pager_begin(v
17e30 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
17e40 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72  exFlag){.  PgHdr
17e50 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
17e60 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17e70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
17e80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
17e90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17ea0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
17eb0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
17ec0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17ed0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
17ee0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
17ef0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
17f00 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
17f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
17f20 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
17f30 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
17f40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
17f50 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
17f60 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
17f70 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
17f80 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
17f90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17fb0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
17fc0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
17fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
17fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17ff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
18000 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
18010 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
18020 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
18030 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18040 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
18050 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
18060 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
18070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18090 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
180a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
180b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
180c0 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
180d0 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41    TRACE2("TRANSA
180e0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
180f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18100 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18110 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
18120 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18130 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18140 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
18150 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
18160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18180 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
18190 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
181a0 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
181b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
181c0 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
181d0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
181e0 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
181f0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
18200 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
18210 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
18220 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
18230 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
18240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18250 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
18260 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
18270 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
18280 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
18290 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
182a0 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
182b0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
182c0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
182d0 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
182e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
182f0 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
18300 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
18310 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
18320 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
18330 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
18340 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
18350 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
18360 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
18370 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
18380 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
18390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
183a0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
183b0 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
183c0 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
183d0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
183e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
183f0 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
18400 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
18410 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
18420 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
18430 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
18440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
18450 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
18460 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
18470 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
18480 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70  it() or sqlite3p
18490 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
184a0 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
184b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
184c0 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
184d0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
184e0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
184f0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18500 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18510 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18530 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
18540 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
18550 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
18560 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
18570 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
18580 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
18590 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
185a0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
185b0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
185c0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
185d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
185e0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
185f0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
18600 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18610 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
18620 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
18630 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
18640 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
18650 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
18660 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
18670 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
18680 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
18690 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
186a0 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
186b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
186c0 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
186d0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
186e0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
186f0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
18700 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
18710 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
18720 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
18730 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
18740 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
18750 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
18760 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
18770 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
18780 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
18790 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
187a0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
187b0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
187c0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
187d0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
187e0 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
187f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18800 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18810 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
18820 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
18830 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
18840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18870 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18880 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
18890 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
188a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
188b0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
188c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
188d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
188e0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
188f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
18920 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18940 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
18950 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
18960 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
18970 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
18980 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
18990 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
189a0 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
189b0 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
189c0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
189d0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
189e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
189f0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
18a00 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
18a10 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
18a20 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18a30 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
18a40 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
18a50 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
18a60 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
18a70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
18a80 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
18a90 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
18aa0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
18ab0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
18ac0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
18ad0 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
18ae0 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
18af0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
18b00 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18b10 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18b20 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18b30 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
18b40 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
18b50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18b60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18b70 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18b80 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
18b90 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
18ba0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
18bb0 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
18bc0 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
18bd0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
18be0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
18bf0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18c00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
18c10 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
18c20 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
18c30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18c50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18c60 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
18c70 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;.          /* 
18c80 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
18c90 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
18ca0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
18cb0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
18cc0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
18cd0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
18ce0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18cf0 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
18d00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
18d10 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
18d20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18d30 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
18d40 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
18d50 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
18d60 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
18d70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18d80 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
18d90 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
18da0 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
18db0 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
18dc0 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
18dd0 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
18de0 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
18df0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  r);.          st
18e00 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c  ore32bits(cksum,
18e10 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61   pPg, pPager->pa
18e20 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
18e30 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
18e40 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
18e50 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
18e60 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
18e70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20  Pg, -4);.       
18e80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18e90 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
18ea0 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
18eb0 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
18ec0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
18ed0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
18ee0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
18ef0 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
18f00 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
18f10 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
18f30 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18f40 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
18f50 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
18f60 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
18f70 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
18f80 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 0);.         
18f90 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
18fa0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
18fb0 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  er) = saved;.   
18fc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
18ff0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
19000 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19010 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
19020 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
19030 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
19040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19060 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
19070 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
19080 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
19090 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
190a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
190b0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
190c0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
190d0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
190e0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
190f0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
19100 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
19110 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19120 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
19130 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
19140 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
19150 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
19160 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19170 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
19180 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
19190 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
191a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
191b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
191c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
191d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
191e0 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
191f0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
19200 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
19210 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
19220 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
19230 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
19240 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19250 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
19260 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
19270 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
19280 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
19290 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
192a0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
192b0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
192c0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
192d0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
192e0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
192f0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
19300 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
19310 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
19320 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
19330 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
19340 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
19350 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
19360 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
19370 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
19380 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
19390 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
193a0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
193b0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
193c0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
193d0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
193e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
193f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
19400 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
19410 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
19420 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
19430 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Size ){.      as
19440 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
19450 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
19460 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
19470 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
19480 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19490 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
194a0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
194b0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
194c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
194d0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
194e0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
194f0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
19500 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
19510 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
19520 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
19530 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
19540 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
19550 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
19560 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19570 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
19580 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
19590 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  }.        TRACE3
195a0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
195b0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
195c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
195d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
195e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
195f0 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
19600 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
19610 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
19620 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19630 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
19640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19650 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19660 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44  >stfd,((char*)pD
19670 61 74 61 29 2d 34 2c 0a 20 20 20 20 20 20 20 20  ata)-4,.        
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
196a0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
196b0 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
196c0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
196d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
196e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
196f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
19700 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
19710 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
19720 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
19730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
19750 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
19760 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19770 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
19780 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
19790 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
197a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
197b0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
197c0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
197d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
197e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
197f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
19800 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
19810 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
19820 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
19830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
19840 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
19850 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
19860 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
19870 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
19880 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
19890 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
198a0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
198b0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
198c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
198d0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
198e0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
198f0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
19900 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
19910 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
19920 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
19930 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
19940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19950 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
19960 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
19970 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
19980 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
19990 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
199a0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
199b0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
199c0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
199d0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
199e0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
199f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
19a00 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
19a10 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
19a20 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
19a30 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
19a40 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
19a50 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
19a60 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23  pPg->dirty;.}..#
19a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19a80 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
19a90 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
19aa0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
19ab0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
19ac0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
19ad0 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
19ae0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
19af0 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
19b00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19b10 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
19b20 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
19b30 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
19b40 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
19b50 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
19b60 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
19b70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19b90 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19ba0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
19bb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
19bd0 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
19be0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19bf0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
19c00 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
19c10 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
19c20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19c30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
19c40 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
19c50 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
19c60 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
19c70 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
19c80 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
19c90 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
19ca0 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
19cb0 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
19cc0 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
19cd0 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
19ce0 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
19cf0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
19d00 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
19d10 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
19d20 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
19d30 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
19d40 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
19d50 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
19d60 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
19d70 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
19d80 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
19d90 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
19da0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
19db0 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
19dc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
19dd0 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
19de0 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
19df0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
19e00 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
19e10 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
19e20 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
19e30 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
19e40 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
19e50 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
19e60 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
19e70 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
19e80 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
19e90 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
19ea0 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
19eb0 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
19ec0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
19ed0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
19ee0 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
19ef0 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
19f00 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
19f10 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
19f20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
19f30 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
19f40 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
19f50 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
19f60 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
19f70 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
19f80 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
19f90 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
19fa0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
19fb0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
19fc0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
19fd0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
19fe0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
19ff0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1a000 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1a010 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1a020 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1a030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a040 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1a050 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
1a060 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
1a070 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1a080 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1a090 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
1a0a0 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
1a0b0 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1a0c0 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1a0d0 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
1a0e0 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
1a0f0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1a100 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
1a110 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1a120 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
1a130 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1a140 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a150 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
1a160 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
1a170 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1a180 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
1a190 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1a1a0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
1a1b0 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
1a1c0 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1a1d0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28  InUse ){.    if(
1a1e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1a1f0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1a200 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1a210 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1a220 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1a230 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1a240 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1a250 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1a260 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1a270 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1a280 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1a290 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1a2a0 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1a2b0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1a2c0 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1a2d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a2e0 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1a2f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1a300 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1a310 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1a320 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1a330 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1a340 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1a350 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1a360 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1a370 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1a380 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1a390 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1a3a0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1a3b0 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1a3c0 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1a3d0 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1a3e0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1a3f0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1a400 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1a410 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1a420 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1a430 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1a440 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1a450 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1a460 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1a470 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
1a480 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1a490 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1a4a0 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1a4b0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1a4c0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1a4d0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1a4e0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1a4f0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1a500 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1a510 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1a520 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1a530 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1a540 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1a550 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1a560 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1a570 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1a580 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1a590 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1a5a0 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1a5b0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1a5c0 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
1a5d0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1a5e0 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
1a5f0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1a600 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1a610 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
1a620 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1a630 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
1a640 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a650 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1a660 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1a670 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
1a680 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
1a690 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1a6a0 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
1a6b0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
1a6c0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
1a6d0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1a6e0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1a6f0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1a700 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1a710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a720 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1a730 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1a740 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
1a750 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1a760 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
1a770 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1a780 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
1a790 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1a7a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1a7b0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1a7c0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1a7d0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
1a7e0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a7f0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1a800 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1a810 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1a820 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1a830 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1a840 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69  Pager));.  }.  i
1a850 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1a860 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1a870 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1a880 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1a890 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1a8a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1a8b0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1a8c0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1a8d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1a8e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a8f0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1a900 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1a910 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1a920 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1a930 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
1a940 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1a950 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23  (pPg);.  }.}...#
1a960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a970 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
1a980 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
1a990 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
1a9a0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
1a9b0 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
1a9c0 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
1a9d0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
1a9e0 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
1a9f0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1aa00 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
1aa10 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
1aa20 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
1aa30 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
1aa40 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
1aa50 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
1aa60 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
1aa70 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
1aa80 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1aa90 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
1aaa0 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
1aab0 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
1aac0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
1aad0 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
1aae0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1aaf0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
1ab00 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
1ab10 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
1ab20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1ab30 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1ab40 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
1ab50 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1ab60 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
1ab70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1ab80 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
1ab90 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
1aba0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1abb0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
1abc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1abd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1abe0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1abf0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
1ac00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1ac10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
1ac20 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
1ac30 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
1ac40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
1ac50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1ac60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1ac70 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1ac80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ac90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1aca0 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20   TRACE2("COMMIT 
1acb0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1acc0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1acd0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
1ace0 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1acf0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1ad00 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
1ad10 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
1ad20 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
1ad30 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1ad40 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
1ad50 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1ad60 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1ad70 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1ad80 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1ad90 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1ada0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1adb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1adc0 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1add0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1ade0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
1adf0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1ae00 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1ae10 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1ae20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1ae30 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1ae40 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1ae50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1ae60 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1ae70 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
1ae80 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
1ae90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1aea0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
1aeb0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1aec0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1aed0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1aee0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1aef0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1af00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1af10 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1af20 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
1af30 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
1af40 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
1af50 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
1af60 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
1af70 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
1af80 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
1af90 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
1afa0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1afb0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
1afc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1afd0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1afe0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1aff0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1b000 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b010 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
1b020 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b030 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b040 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1b050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1b060 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
1b070 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
1b080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b090 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
1b0a0 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
1b0b0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b0c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
1b0d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b0e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
1b0f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1b100 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1b110 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
1b120 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1b130 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
1b140 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rt:.  sqlite3pag
1b150 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
1b160 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1b170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1b180 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1b190 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1b1a0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1b1b0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1b1c0 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1b1d0 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1b1e0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1b1f0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1b200 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1b210 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1b220 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b230 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1b240 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b250 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1b260 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1b270 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1b280 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1b290 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1b2a0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b2b0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1b2c0 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1b2d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b2e0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1b2f0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1b300 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1b310 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1b320 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1b330 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1b340 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1b350 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1b360 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1b370 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1b380 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b3a0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
1b3b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b3c0 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
1b3d0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
1b3e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b3f0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1b400 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1b410 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
1b420 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1b430 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1b440 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1b450 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
1b460 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
1b470 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
1b480 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
1b490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1b4a0 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1b4b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b4c0 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
1b4d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b4e0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1b4f0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1b500 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
1b510 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
1b520 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
1b530 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
1b540 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b550 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b560 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1b570 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1b580 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b590 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
1b5a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b5b0 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
1b5c0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1b5d0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1b5e0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b5f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1b600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
1b610 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
1b620 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
1b630 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1b640 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b650 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
1b660 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1b670 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
1b680 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
1b690 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b6a0 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
1b6b0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
1b6c0 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
1b6d0 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
1b6e0 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1b6f0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1b700 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1b710 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
1b720 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
1b730 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1b740 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
1b750 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1b760 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1b770 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1b780 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1b790 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1b7a0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b7b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1b7c0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1b7d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1b7e0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1b7f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1b800 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1b810 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1b820 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b830 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1b840 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1b850 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1b860 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1b880 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1b890 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
1b8a0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
1b8b0 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
1b8c0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
1b8d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b8e0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
1b8f0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
1b900 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1b910 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
1b920 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
1b930 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
1b940 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1b950 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1b960 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1b970 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f   rc = pager_relo
1b980 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
1b990 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
1b9a0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1b9b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1b9c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b9d0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1b9e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b9f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1ba00 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1ba10 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1ba20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1ba30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1ba40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  PT_BKPT;.    pPa
1ba50 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
1ba60 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
1ba70 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
1ba80 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1ba90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1baa0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1bab0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1bac0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1bad0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1bae0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1baf0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1bb00 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1bb10 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1bb20 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
1bb30 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1bb40 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1bb50 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1bb60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bb70 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1bb80 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
1bb90 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
1bba0 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
1bbb0 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
1bbc0 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
1bbd0 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
1bbe0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
1bbf0 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
1bc00 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
1bc10 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
1bc20 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
1bc30 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
1bc40 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
1bc50 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
1bc60 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23 69 66  er->errMask;.#if
1bc70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1bc80 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
1bc90 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
1bca0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
1bcb0 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
1bcc0 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
1bcd0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
1bce0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
1bcf0 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a  >nWrite;.#endif.
1bd00 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
1bd10 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
1bd20 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
1bd30 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
1bd40 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1bd50 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
1bd60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bd70 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
1bd80 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
1bd90 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1bda0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1bdb0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1bdc0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1bdd0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1bde0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1bdf0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1be00 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1be10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1be20 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
1be30 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1be40 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
1be50 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
1be60 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
1be70 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1be80 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
1be90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1bea0 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
1beb0 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1bec0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1bed0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1bee0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1bef0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1bf00 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1bf10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1bf20 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1bf30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1bf40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1bf50 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1bf60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1bf70 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1bf80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bf90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1bfa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bfb0 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1bfc0 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1bfd0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1bfe0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1bff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1c000 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1c010 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
1c020 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
1c030 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
1c040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c050 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
1c060 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
1c070 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c080 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c090 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
1c0a0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
1c0b0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1c0c0 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
1c0d0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
1c0e0 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
1c0f0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
1c100 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
1c110 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
1c120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
1c130 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1c140 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1c150 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
1c160 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
1c170 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
1c180 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
1c190 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
1c1a0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
1c1b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c1c0 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
1c1d0 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
1c1e0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
1c1f0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1c200 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
1c210 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1c220 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1c230 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1c240 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1c250 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
1c260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c270 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
1c280 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
1c290 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
1c2a0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
1c2b0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
1c2c0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1c2d0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
1c2e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c2f0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
1c300 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c310 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c320 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
1c330 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1c340 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1c350 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1c360 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
1c370 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
1c380 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1c390 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1c3a0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
1c3b0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
1c3c0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1c3d0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
1c3e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
1c3f0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
1c400 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
1c410 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
1c420 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1c430 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1c440 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1c450 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1c460 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
1c470 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
1c480 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1c490 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c4a0 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
1c4b0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
1c4c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1c4d0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1c4e0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1c4f0 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1c500 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1c510 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1c520 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1c530 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1c540 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1c550 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1c560 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1c570 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1c580 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1c590 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1c5a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c5b0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1c5c0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1c5d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c5e0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1c5f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c600 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1c610 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
1c620 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1c630 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
1c640 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1c650 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1c660 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c670 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1c680 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
1c690 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1c6a0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c6b0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1c6c0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
1c6d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
1c6e0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1c6f0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1c700 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
1c710 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c720 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1c730 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1c740 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1c750 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1c760 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1c770 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1c780 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
1c790 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1c7b0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1c7c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
1c7d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1c7e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c7f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1c800 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1c810 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
1c820 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1c830 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1c840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c860 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
1c870 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
1c880 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1c890 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c8a0 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
1c8b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1c8c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1c8d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1c8e0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1c8f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c900 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1c910 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1c920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c930 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1c940 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
1c950 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
1c960 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1c970 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1c980 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1c990 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
1c9a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1c9b0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1c9c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1c9d0 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
1c9e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1c9f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
1ca00 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
1ca10 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1ca20 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1ca30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1ca40 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1ca50 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
1ca60 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
1ca70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1ca80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1ca90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1caa0 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
1cab0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
1cac0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
1cad0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
1cae0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
1caf0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
1cb00 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
1cb10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73  sqlite3pager_nos
1cb20 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1cb30 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1cb40 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
1cb50 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1cb60 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1cb70 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1cb80 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65  e3pager_set_code
1cb90 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
1cba0 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  er,.  void (*xCo
1cbb0 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
1cbc0 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
1cbd0 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
1cbe0 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
1cbf0 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
1cc00 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
1cc10 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
1cc20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cc30 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1cc40 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1cc50 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1cc60 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1cc70 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1cc80 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1cc90 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1cca0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1ccb0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1ccc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
1ccd0 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
1cce0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1ccf0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1cd00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1cd10 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1cd20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1cd30 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1cd40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1cd50 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
1cd60 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1cd70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1cd80 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1cd90 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1cda0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1cdb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1cdc0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1cdd0 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1cde0 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1cdf0 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
1ce00 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
1ce10 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
1ce20 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
1ce30 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
1ce40 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
1ce50 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1ce60 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1ce70 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1ce80 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1ce90 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1cea0 73 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e  store32bits(chan
1ceb0 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48  ge_counter, pPgH
1cec0 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52  dr, 24);..  /* R
1ced0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1cee0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1cef0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1cf00 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
1cf10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cf20 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1cf30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1cf40 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1cf50 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1cf60 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1cf70 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1cf80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1cf90 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1cfa0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1cfb0 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1cfc0 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1cfd0 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1cfe0 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1cff0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1d000 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1d010 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1d020 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1d030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1d040 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1d050 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1d060 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1d070 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1d080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d090 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1d0a0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1d0b0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1d0c0 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1d0d0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1d0e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1d0f0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1d100 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1d110 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d120 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1d130 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1d140 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1d150 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1d160 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1d170 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1d180 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1d190 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1d1a0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1d1b0 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1d1c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1d1d0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1d1e0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1d1f0 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1d200 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1d210 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1d220 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1d230 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1d240 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1d250 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1d260 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1d270 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1d280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1d290 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1d2a0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1d2b0 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1d2c0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1d2d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1d2e0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1d2f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d300 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1d310 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1d320 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1d330 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1d340 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1d350 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1d360 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1d370 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1d380 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1d390 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1d3a0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1d3b0 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1d3c0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d3d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d3e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1d3f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1d400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d410 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1d420 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1d430 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1d440 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1d450 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1d460 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1d470 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1d480 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1d490 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1d4a0 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1d4b0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1d4c0 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1d4d0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1d4e0 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1d4f0 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1d500 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1d510 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1d520 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1d530 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1d540 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1d550 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1d560 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1d570 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d580 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1d590 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1d5a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d5b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d5c0 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1d5d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1d5e0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1d5f0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1d600 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1d610 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1d620 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1d630 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1d640 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1d650 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1d660 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1d670 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1d680 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1d690 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1d6a0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1d6b0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d6c0 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1d6d0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  pPage;.        i
1d6e0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
1d6f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1d700 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
1d710 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
1d720 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1d730 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
1d740 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
1d750 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
1d760 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
1d770 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
1d780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d790 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1d7a0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
1d7b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d7c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d7d0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1d7e0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1d7f0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1d800 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1d810 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d820 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1d830 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d850 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d860 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1d870 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
1d880 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d890 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
1d8a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1d8b0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1d8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d8d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d8e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
1d8f0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d900 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1d910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d920 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1d930 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
1d940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d950 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
1d960 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1d970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d980 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d990 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
1d9a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d9b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1d9c0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
1d9d0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
1d9e0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
1d9f0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1da00 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
1da10 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1da20 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1da30 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
1da40 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1da50 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
1da60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1da70 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1da80 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
1da90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1daa0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1dab0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1dac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1dad0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1dae0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1daf0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1db00 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1db10 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
1db20 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1db30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1db40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1db50 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1db60 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1db70 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1db80 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1db90 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1dba0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1dbb0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1dbc0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1dbd0 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1dbe0 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1dbf0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1dc00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1dc10 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1dc20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1dc30 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1dc40 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1dc50 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1dc60 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1dc70 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1dc80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1dc90 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1dca0 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1dcb0 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1dcc0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1dcd0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1dce0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1dcf0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1dd00 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1dd10 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1dd20 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1dd30 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1dd40 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1dd50 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1dd60 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1dd70 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1dd80 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1dd90 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1dda0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1ddb0 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1ddc0 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1ddd0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1dde0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1ddf0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1de00 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1de10 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1de20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1de30 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1de40 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1de50 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1de60 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1de70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1de80 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1de90 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1dea0 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1deb0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1dec0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1ded0 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1dee0 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1def0 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1df00 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1df10 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1df20 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1df30 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1df40 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1df50 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1df60 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1df70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1df80 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1df90 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  , pgno);..  if( 
1dfa0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1dfb0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
1dfc0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
1dfd0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1dfe0 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1dff0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1e000 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
1e010 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e020 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
1e030 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
1e040 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
1e050 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
1e060 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1e070 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
1e080 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
1e090 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
1e0a0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
1e0b0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
1e0c0 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
1e0d0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
1e0e0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
1e0f0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
1e100 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
1e110 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
1e120 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
1e130 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
1e140 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
1e150 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
1e160 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
1e170 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1e180 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1e190 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
1e1a0 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1e1b0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
1e1c0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1e1d0 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
1e1e0 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74      pPgOld->dirt
1e1f0 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1e200 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
1e210 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e220 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
1e230 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
1e240 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1e250 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1e260 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
1e270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1e280 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
1e290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
1e2a0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
1e2b0 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
1e2c0 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
1e2d0 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
1e2e0 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   */.  pPg->pgno 
1e2f0 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61  = pgno;.  h = pa
1e300 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
1e310 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1e320 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1e330 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1e340 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1e350 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1e360 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1e370 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1e380 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1e390 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1e3a0 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1e3b0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1e3c0 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1e3d0 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e  sh = 0;..  pPg->
1e3e0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61  dirty = 1;.  pPa
1e3f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1e400 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1e410 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1e420 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1e430 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1e440 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e450 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1e460 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1e470 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1e480 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1e490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1e4a0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1e4b0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1e4c0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1e4d0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1e4e0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1e4f0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
1e500 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
1e510 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
1e520 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
1e530 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
1e540 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
1e550 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
1e560 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
1e570 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1e580 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
1e590 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
1e5a0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
1e5b0 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
1e5c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
1e5d0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
1e5e0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
1e5f0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1e600 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
1e610 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
1e620 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
1e630 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
1e640 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1e650 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
1e660 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1e670 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
1e680 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
1e690 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e6a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e6b0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
1e6c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1e6d0 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1e6e0 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
1e6f0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1e700 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1e710 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
1e720 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  al = 1;.    DATA
1e730 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1e740 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b  ync)->dirty = 1;
1e750 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1e760 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
1e770 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1e780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1e790 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1e7a0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e7b0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e7c0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1e7d0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1e7e0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
1e7f0 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
1e800 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1e810 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1e820 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
1e830 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
1e840 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
1e850 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
1e860 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
1e870 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
1e880 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
1e890 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1e8a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1e8b0 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
1e8c0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
1e8d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1e8e0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1e8f0 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
1e900 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
1e910 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
1e920 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
1e930 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1e940 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
1e950 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1e960 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
1e970 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1e980 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1e990 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
1e9a0 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
1e9b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
1e9c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e9d0 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
1e9e0 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
1e9f0 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
1ea00 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1ea10 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
1ea20 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
1ea30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ea40 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.