/ Hex Artifact Content
Login

Artifact ccdd092702decc02fd3a54380c6d46c546eea5a6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 34  : pager.c,v 1.24
0350: 35 20 32 30 30 36 2f 30 31 2f 31 38 20 31 38 3a  5 2006/01/18 18:
0360: 32 32 3a 34 33 20 64 61 6e 69 65 6c 6b 31 39 37  22:43 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0620: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0630: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0640: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0650: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0660: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0670: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0680: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0690: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
06a0: 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a  akes an OsFile.*
06b0: 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  * struct as it's
06c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64   argument..*/.#d
06d0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 26 28   FILEHANDLEID(&(
06f0: 70 29 2d 3e 66 64 29 0a 23 64 65 66 69 6e 65 20  p)->fd).#define 
0700: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0710: 20 28 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 48   (sqlite3OsFileH
0720: 61 6e 64 6c 65 28 26 66 64 29 29 0a 0a 2f 2a 0a  andle(&fd))../*.
0730: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0740: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0750: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0770: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0780: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0790: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
07d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
07e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
07f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0800: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0820: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0830: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0840: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0860: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0870: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0880: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0890: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
08d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
08e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0910: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0920: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0950: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0960: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0970: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0980: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0990: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
09d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
09e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
09f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a20: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a30: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a40: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0a70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0a80: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0ab0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0ac0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0ad0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0af0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0b60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0b70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0b80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0ba0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bb0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0bc0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0bf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0c60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0c70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0c80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0cc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0cd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0cf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0dd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0eb0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ec0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ed0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0ee0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0ef0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0f00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0f10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0f20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0f30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0f40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0f50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0f60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0f70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0f80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0f90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0fb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0fc0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0fd0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0fe0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ff0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
1000: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
1010: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
1020: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
1030: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
1040: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
1050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
1060: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
1070: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
1080: 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a  ARED      1   /*
1090: 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f   same as SHARED_
10a0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
10c0: 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    2   /* same as
10d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a   RESERVED_LOCK *
10e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10f0: 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20  EXCLUSIVE   4   
1100: 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55  /* same as EXCLU
1110: 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  SIVE_LOCK */.#de
1120: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
1130: 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20  D      5../*.** 
1140: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  If the SQLITE_BU
1150: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1160: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f   macro is set to
1170: 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65   true at compile
1180: 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66  -time,.** then f
1190: 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74  ailed attempts t
11a0: 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64  o get a reserved
11b0: 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b   lock will invok
11c0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ack..** This is 
11e0: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20  off by default. 
11f0: 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e   To see why, con
1200: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1210: 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a  ing scenario:.**
1220: 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72   .** Suppose thr
1230: 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61  ead A already ha
1240: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1250: 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65  and wants a rese
1260: 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68  rved lock..** Th
1270: 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68  read B already h
1280: 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  as a reserved lo
1290: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20  ck and wants an 
12a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12b0: 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65   If.** both thre
12c0: 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  ads are using th
12d0: 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63  eir busy callbac
12e0: 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ks, it might be 
12f0: 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62  a long time.** b
1300: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
1310: 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70   threads give up
1320: 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20   and allows the 
1330: 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64  other to proceed
1340: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
1350: 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f  thread trying to
1360: 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65   get the reserve
1370: 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20  d lock gives up 
1380: 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69  quickly.** (if i
1390: 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  t never invokes 
13a0: 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63  its busy callbac
13b0: 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  k) then the cont
13c0: 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ention will be.*
13d0: 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b  * resolved quick
13e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ly..*/.#ifndef S
13f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1400: 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  VED_LOCK.# defin
1410: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
1420: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65  SERVED_LOCK 0.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1440: 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61   macro rounds va
1450: 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20  lues up so that 
1460: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1470: 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a  an address it.**
1480: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1490: 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20  o be an address 
14a0: 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20  that is aligned 
14b0: 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  to an 8-byte bou
14c0: 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ndary..*/.#defin
14d0: 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  e FORCE_ALIGNMEN
14e0: 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26  T(X)   (((X)+7)&
14f0: 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ~7)../*.** Each 
1500: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
1510: 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73  of a page begins
1520: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1530: 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54  ing header..** T
1540: 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e  his header is on
1550: 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ly visible to th
1560: 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e  is pager module.
1570: 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20    The client.** 
1580: 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20  code that calls 
1590: 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20  pager sees only 
15a0: 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  the data that fo
15b0: 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72  llows the header
15c0: 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63  ..**.** Client c
15d0: 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ode should call 
15e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15f0: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1600: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1610: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1620: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1630: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1640: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  e sqlite3pager_w
1650: 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c  rite().** is cal
1660: 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  led, the origina
1670: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
1680: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
16a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48   journal and PgH
16b0: 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  dr.inJournal and
16c0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
16d0: 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c  are set.  Later,
16e0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75   once.** the jou
16f0: 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61  rnal page has ma
1700: 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64  de it onto the d
1710: 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48  isk surface, PgH
1720: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69  dr.needSync.** i
1730: 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20  s cleared.  The 
1740: 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61  modified page ca
1750: 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20  nnot be written 
1760: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
1770: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1780: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  se file until th
1790: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20  e journal pages 
17a0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
17b0: 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a  to disk and the.
17c0: 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  ** PgHdr.needSyn
17d0: 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  c has been clear
17e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67  ed..**.** The Pg
17f0: 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69  Hdr.dirty flag i
1800: 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74  s set when sqlit
1810: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1820: 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a  is called and.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69   is cleared agai
1840: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  n when the page 
1850: 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74  content is writt
1860: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f  en back to the o
1870: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70  ase file..*/.typ
1890: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
18a0: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
18b0: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
18c0: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
18f0: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
1900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1930: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1940: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1950: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
1960: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
1970: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
1980: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
1990: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19a0: 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72  xtFree, *pPrevFr
19b0: 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74  ee;  /* Freelist
19c0: 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20   of pages where 
19d0: 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  nRef==0 */.  PgH
19e0: 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20  dr *pNextAll;   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
1a10: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
1a20: 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76  NextStmt, *pPrev
1a30: 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  Stmt;  /* List o
1a40: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
1a50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a60: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1a70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1a80: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1a90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1aa0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1ab0: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68  /* TRUE if in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
1af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1b00: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b20: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
1b30: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
1b40: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
1b50: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1b70: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1b80: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1b90: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1bb0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1bc0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1be0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
1bf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1c10: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
1c20: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1c30: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1c40: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
1c50: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
1c60: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66  gHdr.pgno */.#if
1c70: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c80: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1c90: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1ca0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1cc0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cd0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1ce0: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1cf0: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d10: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d20: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d30: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d40: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d60: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d70: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1d80: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1d90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1da0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1db0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1dc0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1dd0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1df0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e00: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e10: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e20: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e30: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e40: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e50: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e60: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e70: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1e80: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1e90: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ea0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1eb0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ec0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ed0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1ee0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1ef0: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f00: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f10: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f20: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f30: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f40: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f50: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f60: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f70: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1f80: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1f90: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fa0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fb0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fc0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1fd0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1fe0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1ff0: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2000: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2010: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2030: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2040: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2050: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2060: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2080: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
2090: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
20a0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
20b0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
20c0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
20d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
20e0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
20f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2100: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2110: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2120: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2130: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2140: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2150: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2160: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2170: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2180: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2190: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
21a0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
21b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
21c0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
21d0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
21e0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
21f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2200: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2210: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2220: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2230: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2240: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2250: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2260: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
2270: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2280: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
2290: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
22a0: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
22b0: 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  ber. This macro 
22c0: 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73  looks a little s
22d0: 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61  illy, but is eva
22e0: 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d  luated.** at com
22f0: 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72  pile-time, not r
2300: 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73  un-time (at leas
2310: 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20 69  t for gcc this i
2320: 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66  s true)..*/.#def
2330: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c  ine N_PG_HASH (\
2340: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30  .  (MAX_PAGES>10
2350: 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d  24)?2048: \.  (M
2360: 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30  AX_PAGES>512)?10
2370: 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  24: \.  (MAX_PAG
2380: 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20  ES>256)?512: \. 
2390: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29   (MAX_PAGES>128)
23a0: 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?256: \.  (MAX_P
23b0: 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20  AGES>64)?128:64 
23c0: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  \.)../*.** Hash 
23d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
23e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
23f0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2400: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2410: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2420: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2430: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2440: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2460: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2470: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2480: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2490: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
24a0: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
24b0: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
24c0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
24d0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
24e0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
24f0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
2500: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
2510: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
2520: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2530: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2540: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2550: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2560: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2570: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2580: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2590: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
25a0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
25b0: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
25c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
25d0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
25e0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
25f0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
2600: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
2610: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
2620: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2630: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2640: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2650: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2660: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2670: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2680: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2690: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
26a0: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
26b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
26c0: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
26d0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
26e0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
26f0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2700: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2710: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2720: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2730: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2760: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2770: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2780: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
27b0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
27f0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2800: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2810: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2820: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2830: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2840: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2850: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2860: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2880: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2890: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
28a0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
28b0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
28c0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
28d0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
28e0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
28f0: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2910: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2920: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2930: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2940: 0a 20 20 75 38 20 65 72 72 43 6f 64 65 3b 20 20  .  u8 errCode;  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2970: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2980: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29a0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
29b0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
29c0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
29d0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
29e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29f0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2a00: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2a10: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2a20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a30: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2a40: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2a50: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2a60: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2a70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a80: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2a90: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2aa0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2ab0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2ac0: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
2ad0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
2ae0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
2af0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2b00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b10: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2b20: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2b30: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2b40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b50: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2b60: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2b70: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 64   jrnl */.  int d
2b80: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ba0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2bb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2bc0: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2bd0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2be0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2bf0: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2c00: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c20: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2c30: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2c40: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2c50: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c90: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
2ca0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
2cb0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2cc0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2cd0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2ce0: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2cf0: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d10: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2d20: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2d30: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d50: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
2d60: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
2d70: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d80: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2db0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2dc0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2de0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2df0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2e00: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65  /.  int nMaxPage
2e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e20: 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d 61  /* High water ma
2e30: 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20  rk of nPage */. 
2e40: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2e70: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2e80: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2e90: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2ec0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2ed0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  in cache */.  u8
2ee0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
2ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2f00: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2f10: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f20: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
2f30: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f50: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f60: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
2f80: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2f90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2fa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2fc0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2ff0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3010: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
3020: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
3030: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
3040: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3070: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
3080: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
3090: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
30b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
30c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
30d0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
30e0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
30f0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
3100: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
3110: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
3120: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
3130: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
3140: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
3150: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
3160: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
3170: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
3180: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
3190: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
31a0: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
31d0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
31e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
31f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
3200: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
3210: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3220: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3230: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
3240: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
3250: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3270: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3290: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
32a0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
32b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
32c0: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
32e0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
32f0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3300: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3310: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3330: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
3340: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
3350: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3360: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3370: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3380: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3390: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
33a0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
33b0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
33c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
33d0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
33e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33f0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3400: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3410: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3420: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3430: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
3440: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3460: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3470: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3480: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3490: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
34a0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
34b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
34c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
34d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
34e0: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
34f0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
3500: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
3510: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
3520: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
3530: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3540: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3550: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3560: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3570: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3590: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
35a0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67 48  Codec() */.  PgH
35b0: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
35c0: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
35d0: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
35e0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
35f0: 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  dr */.#ifdef SQL
3600: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3610: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3620: 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ager *pNext;    
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3640: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
3650: 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65  ers in this thre
3660: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ad */.#endif.};.
3670: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
3680: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
3690: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
36a0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76  the variable giv
36b0: 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67  en in.** the arg
36c0: 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20  ument.*/.#ifdef 
36d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65  SQLITE_TEST.# de
36e0: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
36f0: 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  x++.#else.# d
3700: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3710: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
3720: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3730: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3740: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3750: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3760: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3770: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3780: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3790: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
37a0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
37b0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
37c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37d0: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
37e0: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
37f0: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3800: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3810: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3820: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3830: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
3840: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3850: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3860: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3870: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3880: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3890: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
38a0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
38b0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
38c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
38d0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
38e0: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
38f0: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3900: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3910: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3920: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3930: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3940: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3950: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3960: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3970: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3980: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3990: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
39a0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
39b0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
39c0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
39d0: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
39e0: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
39f0: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
3a00: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
3a10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
3a20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
3a30: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
3a40: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
3a50: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
3a60: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
3a70: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
3a80: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3a90: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
3aa0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
3ab0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
3ac0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
3ad0: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
3ae0: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
3af0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
3b00: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
3b10: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
3b20: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
3b30: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
3b40: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
3b50: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
3b60: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
3b70: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
3b80: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
3b90: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
3ba0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
3bb0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
3bc0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
3bd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
3be0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
3bf0: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
3c00: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
3c10: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
3c20: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
3c30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3c40: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3c50: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
3c60: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3c70: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3c80: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
3c90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
3ca0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3cb0: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
3cc0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
3cd0: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
3ce0: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
3cf0: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
3d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3d10: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3d30: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
3d40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
3d50: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
3d60: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
3d70: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
3d80: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
3d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
3da0: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
3db0: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
3dc0: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
3dd0: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
3de0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
3df0: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
3e00: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
3e10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
3e20: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
3e30: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
3e40: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
3e50: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
3e60: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
3e70: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
3e80: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
3e90: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
3ea0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3ec0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
3ed0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
3ee0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
3ef0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
3f00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
3f10: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
3f20: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
3f30: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
3f40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3f50: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f60: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3f70: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
3f80: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
3f90: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
3fa0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  ** The default s
3fb0: 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65  ize of a disk se
3fc0: 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ctor.*/.#define 
3fd0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
3fe0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  E 512../*.** Pag
3ff0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4000: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4010: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4020: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4030: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4040: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4050: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4060: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4070: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4080: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4090: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
40a0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
40b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40c0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40d0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40f0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4100: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4110: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4120: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4130: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4140: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4150: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4160: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4170: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4180: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4190: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
41a0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41b0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
41c0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41d0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41e0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4200: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4210: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4220: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4230: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4240: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4250: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4260: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4280: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
4290: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
42a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
42b0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
42c0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
42d0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
42e0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
42f0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4300: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4310: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4320: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4330: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4340: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
4350: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
4360: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4370: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4380: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4390: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
43a0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
43b0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
43c0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
43d0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
43e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
43f0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4410: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4420: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4430: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4440: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4450: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4460: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4470: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4480: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4490: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
44a0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
44b0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
44c0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
44d0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
44e0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
44f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4500: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4510: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4530: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4540: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4550: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4560: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4580: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
4590: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
45a0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
45b0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
45c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
45d0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
45e0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
45f0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4600: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4610: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4620: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4630: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4640: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4650: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4660: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4670: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4680: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4690: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
46a0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
46b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
46c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
46d0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
46e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
46f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4700: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4710: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4720: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4730: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4740: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4750: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4760: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
4770: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
4780: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
4790: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
47a0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
47c0: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
47d0: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
47e0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
47f0: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4800: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4810: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4820: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4830: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4840: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
4850: 65 74 29 7b 0a 20 20 63 68 61 72 20 2a 61 63 3b  et){.  char *ac;
4860: 0a 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a  .  ac = &((char*
4870: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4880: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 70 75  ))[offset];.  pu
4890: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
48d0: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
48e0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
48f0: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
4900: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
4910: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
4920: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
4930: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
4940: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
4950: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
4960: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
4970: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
4980: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
4990: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
49a0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
49b0: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
49c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
49d0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
49e0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
49f0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
4a00: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4a10: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4a20: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4a30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4a40: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4a50: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4a60: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4a70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4a80: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4aa0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4ab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ac0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4ae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4af0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4b10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
4b20: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c  SQLITE_PROTOCOL,
4b30: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
4b40: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
4b50: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
4b60: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4b70: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
4b80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
4b90: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
4ba0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
4bb0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4bc0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
4bd0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 61 73 73  , int rc){.  ass
4be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4bf0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4c00: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4c10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4c20: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4c30: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4c40: 20 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45   .    rc==SQLITE
4c50: 5f 49 4f 45 52 52 20 7c 7c 20 0a 20 20 20 20 72  _IOERR || .    r
4c60: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
4c70: 54 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c  T ||.    rc==SQL
4c80: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4c90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4ca0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4cb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4cc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4cd0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
4ce0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
4cf0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
4d00: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
4d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4d20: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
4d30: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
4d40: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4d50: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4d60: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
4d70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4d80: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4d90: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
4da0: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
4db0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
4dc0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4dd0: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
4de0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
4df0: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
4e00: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
4e10: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
4e20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
4e30: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
4e40: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
4e50: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
4e60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
4e70: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
4e80: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
4e90: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
4ea0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
4eb0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
4ec0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
4ed0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
4ee0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
4ef0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
4f00: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
4f10: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4f20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
4f30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4f40: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
4f50: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
4f60: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
4f70: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
4f80: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
4f90: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
4fa0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
4fb0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
4fc0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
4fd0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
4fe0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
4ff0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5000: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5010: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5020: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
5030: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5040: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5050: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5060: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
5070: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
5080: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5090: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
50a0: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
50b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
50c0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
50d0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
50e0: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
50f0: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
5100: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
5110: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
5120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5130: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
5140: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5150: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5160: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5180: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
5190: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
51a0: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
51b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
51c0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
51d0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
51e0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
51f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
5200: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
5210: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
5220: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
5230: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
5240: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5250: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5260: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5270: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5280: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5290: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
52a0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
52b0: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
52c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
52d0: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
52e0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
52f0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
5300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5310: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5320: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5330: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
5340: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5360: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5370: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
5380: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
5390: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
53a0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
53b0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
53c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
53d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
53e0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
53f0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5400: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5410: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
5420: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
5430: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
5440: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5450: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5460: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5470: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5480: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
5490: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
54a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
54b0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
54c0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
54d0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
54e0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
54f0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
5500: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
5510: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
5520: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5530: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5540: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5550: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5560: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
5570: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5580: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
5590: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
55a0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
55b0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
55c0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
55d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
55e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
55f0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
5600: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
5610: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
5620: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
5630: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5640: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5650: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5660: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5670: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5680: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
56a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
56b0: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
56c0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
56d0: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
56e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
56f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
5700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
5710: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5720: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5730: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
5740: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5750: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5760: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5770: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5780: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5790: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
57a0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
57b0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
57c0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
57d0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
57e0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
57f0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
5820: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5830: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
5840: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5850: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5860: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5870: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5880: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5890: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
58a0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
58b0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
58c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
58d0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
58e0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
58f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5900: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5910: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5920: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5930: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5940: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5950: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5960: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5970: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5980: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5990: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
59a0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
59b0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
59c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
59d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
59e0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
59f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5a00: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5a10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5a20: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5a30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5a40: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5a50: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5a60: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5a70: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5a80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5a90: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5aa0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5ab0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5ac0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5ad0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5ae0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5af0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5b00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5b10: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5b20: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5b30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5b40: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5b50: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5b60: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5b70: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5b80: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5b90: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5ba0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5bb0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5bc0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5bd0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5be0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5bf0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5c00: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5c10: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5c20: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5c30: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5c40: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5c50: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5c70: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5c80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c90: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5ca0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5cb0: 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20  ic)+16];..  int 
5cc0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
5cd0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5ce0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5cf0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5d00: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5d10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5d20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5d30: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5d40: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5d50: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5d60: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5d70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5d80: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5d90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5da0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5db0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5dc0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5dd0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5de0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
5df0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
5e00: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
5e10: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
5e20: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
5e30: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
5e40: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
5e50: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
5e60: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
5e70: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
5e80: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
5e90: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
5ea0: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
5eb0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
5ec0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
5ed0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5ee0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5ef0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
5f00: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
5f10: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
5f20: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
5f30: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
5f40: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
5f50: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
5f60: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5f70: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
5f80: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
5f90: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
5fa0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
5fb0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
5fc0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5fd0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
5fe0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
5ff0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6000: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6010: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
6020: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
6030: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
6040: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6050: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6060: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6070: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6080: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
6090: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
60a0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
60b0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
60c0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
60d0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
60e0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
60f0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6100: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
6110: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6120: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
6130: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
6140: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
6150: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
6160: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
6170: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6180: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6190: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
61a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
61b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
61c0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
61d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
61e0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
61f0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
6200: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
6210: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6220: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6240: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6250: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6260: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6270: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6280: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
62a0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
62b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
62c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
62d0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
62e0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
62f0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6300: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6310: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6320: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6330: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6340: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6350: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6360: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6370: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6380: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6390: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
63a0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
63b0: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
63e0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
63f0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6400: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6410: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6420: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6430: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6440: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6450: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6460: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6470: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6490: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
64a0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
64b0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
64c0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
64d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
64e0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
64f0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6500: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6510: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6520: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6530: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6540: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6550: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6560: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6570: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6580: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
65a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
65b0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
65c0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
65d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
65e0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
65f0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6600: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6610: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6620: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6630: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6640: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6650: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6660: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6670: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6680: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6690: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
66a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
66b0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
66c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
66d0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
66e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
66f0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6700: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6710: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6720: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6730: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6740: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6750: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6760: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6780: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6790: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
67a0: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
67b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
67c0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
67d0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
67e0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
67f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6800: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6810: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6820: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6830: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
6840: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6850: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6860: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6870: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6880: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6890: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
68a0: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
68b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
68c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
68d0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
68e0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
68f0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
6900: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6910: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
6920: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
6930: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6940: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6950: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6960: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6970: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6980: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6990: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
69a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
69b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
69c0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
69d0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
69e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
69f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6a00: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
6a10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6a20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6a30: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
6a40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6a50: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
6a60: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
6a70: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
6a80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6a90: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
6aa0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6ab0: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
6ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6ad0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
6ae0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
6af0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
6b00: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
6b10: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
6b20: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
6b30: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
6b40: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
6b50: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
6b60: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
6b70: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
6b80: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
6b90: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
6ba0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
6bb0: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
6bc0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
6bd0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
6be0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
6bf0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
6c00: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
6c10: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
6c20: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
6c30: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
6c40: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
6c50: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
6c60: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
6c70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
6c80: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
6c90: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
6ca0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
6cb0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
6cc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
6cd0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
6ce0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
6cf0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
6d00: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
6d10: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
6d20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
6d30: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
6d40: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
6d50: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
6d60: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
6d70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6d80: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
6d90: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
6da0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
6db0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6dc0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
6dd0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
6de0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
6df0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6e00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
6e10: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
6e20: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
6e30: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
6e40: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
6e50: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
6e60: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
6e70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
6e80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
6e90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
6ea0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
6eb0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
6ec0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ed0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
6ee0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
6ef0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
6f00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
6f10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
6f20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
6f30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
6f40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
6f50: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6f60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
6f70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6f80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
6f90: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6fa0: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
6fb0: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
6fc0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6fd0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
6fe0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
6ff0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7000: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
7010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7020: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7030: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7050: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7060: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7070: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7080: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7090: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
70a0: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
70b0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
70c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
70d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
70e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
70f0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
7100: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7110: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7120: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7130: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7140: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7150: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7160: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7170: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7180: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7190: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
71a0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
71b0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
71c0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
71d0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
71e0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
71f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
7200: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
7210: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
7220: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
7230: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
7240: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
7250: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
7260: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
7270: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
7280: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
7290: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
72a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
72b0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
72c0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
72d0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
72e0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
72f0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
7300: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
7310: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
7330: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
7340: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
7350: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
7360: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
7370: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7380: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
7390: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
73a0: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
73b0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
73c0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
73d0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
73e0: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
73f0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
7400: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
7410: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
7420: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
7430: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
7440: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7450: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
7460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7470: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7480: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
7490: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
74a0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
74b0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
74c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
74d0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
74e0: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
74f0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
7500: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
7510: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
7520: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
7530: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7540: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7550: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
7560: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7570: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7580: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
7590: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
75a0: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
75b0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
75c0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
75d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
75e0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
75f0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
7600: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7610: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7620: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7630: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
7640: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7650: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7660: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7670: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7680: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
7690: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
76a0: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
76b0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
76c0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
76d0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
76e0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
76f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7700: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
7710: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7720: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7730: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7740: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
7750: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
7760: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
7770: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
7780: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
7790: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
77a0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
77b0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
77c0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
77d0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
77e0: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
77f0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
7800: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
7810: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7820: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7830: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7840: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
7850: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
7860: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
7870: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7880: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
7890: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
78a0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
78b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
78c0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
78d0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
78e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
78f0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7900: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7910: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7920: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
7930: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
7940: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
7950: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
7960: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
7970: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
7980: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
7990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
79a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
79b0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
79c0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
79d0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
79e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
79f0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
7a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
7a10: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
7a20: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
7a30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
7a40: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7a60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7a70: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7a80: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7a90: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7aa0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7ab0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7ac0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7ad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7ae0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
7af0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
7b00: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
7b10: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
7b20: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
7b30: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7b40: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7b50: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7b60: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7b70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7b80: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7b90: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7ba0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7bb0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7bc0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7bd0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
7be0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
7bf0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
7c00: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
7c10: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
7c20: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
7c30: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7c40: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7c50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7c60: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7c70: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7c80: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7c90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7ca0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7cb0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7cc0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7cd0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
7ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7cf0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
7d00: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
7d10: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
7d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
7d30: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7d40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7d50: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7d60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7d70: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7d80: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7d90: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7da0: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7db0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7dc0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7dd0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7de0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
7df0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7e00: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
7e10: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
7e20: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
7e30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7e40: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7e50: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7e60: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
7e70: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
7e80: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
7e90: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
7ea0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
7eb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7ec0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
7ed0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
7ee0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
7ef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7f00: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
7f10: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
7f20: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
7f30: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
7f40: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
7f50: 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   );.  }.  rc = s
7f60: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7f70: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
7f80: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
7f90: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
7fa0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
7fb0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
7fc0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
7fd0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
7fe0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7ff0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
8000: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
8010: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
8020: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
8030: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
8040: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
8050: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
8060: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
8070: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
8080: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
8090: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
80a0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
80b0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
80c0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
80d0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
80e0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
80f0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
8100: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
8110: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
8120: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
8130: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
8140: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
8150: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
8160: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
8170: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
8180: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
8190: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
81a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
81b0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
81c0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
81d0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
81e0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
81f0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
8200: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
8210: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
8220: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
8230: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
8240: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
8250: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
8260: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
8270: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
8280: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
8290: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
82a0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
82b0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
82c0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
82d0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
82e0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
82f0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
8300: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
8310: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
8320: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
8330: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
8340: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
8350: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
8360: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
8370: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
8380: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
8390: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
83a0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
83b0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
83c0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
83d0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
83e0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
83f0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
8400: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
8410: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
8420: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
8430: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
8440: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
8450: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8460: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
8470: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
8480: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
8490: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
84a0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
84b0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
84c0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
84d0: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
84e0: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
84f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8500: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
8510: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
8520: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
8530: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
8540: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
8550: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
8560: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
8570: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
8580: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
8590: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
85a0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
85b0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
85c0: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
85d0: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
85e0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
85f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8600: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
8610: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
8620: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
8630: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
8640: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
8650: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
8660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8670: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
8680: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
8690: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
86c0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
86d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
86e0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
8700: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
8710: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8720: 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51  */.  u8 aData[SQ
8730: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8740: 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74  ZE];  /* Temp st
8750: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
8760: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
8770: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
8780: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
8790: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
87a0: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
87b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
87c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
87d0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
87e0: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
87f0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
8800: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
8810: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
8820: 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61   );...  rc = rea
8830: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
8840: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
8850: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8860: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
8870: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
8880: 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  &aData, pPager->
8890: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  pageSize);.  if(
88a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
88b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
88c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
88d0: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
88e0: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
88f0: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
8900: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
8910: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
8920: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
8930: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
8940: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
8950: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
8960: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8970: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
8980: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
8990: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
89a0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
89b0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
89c0: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
89d0: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
89e0: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
89f0: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
8a00: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
8a10: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
8a20: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
8a30: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
8a40: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
8a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8a60: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
8a70: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
8a80: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
8a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8aa0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
8ab0: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
8ac0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8ad0: 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  d, &cksum);.    
8ae0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
8af0: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
8b00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
8b10: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
8b20: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e  ksum(pPager, pgn
8b30: 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  o, aData)!=cksum
8b40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8b50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8b60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
8b70: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
8b80: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
8b90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
8ba0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
8bb0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
8bc0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
8bd0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
8be0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
8bf0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
8c00: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
8c10: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
8c20: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
8c30: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
8c40: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
8c50: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
8c60: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8c70: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
8c80: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
8c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
8ca0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
8cb0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
8cc0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
8cd0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
8ce0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
8cf0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
8d00: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
8d10: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
8d20: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
8d30: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
8d40: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
8d50: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
8d60: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
8d70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
8d80: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
8d90: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
8dc0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
8dd0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
8de0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
8df0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
8e00: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
8e10: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
8e20: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
8e30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
8e40: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
8e50: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
8e60: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
8e70: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
8e80: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
8e90: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
8ea0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
8eb0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
8ec0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
8ed0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
8ee0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
8ef0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
8f00: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
8f10: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
8f20: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
8f30: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
8f40: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
8f50: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
8f60: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
8f70: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
8f80: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
8f90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
8fa0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
8fb0: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
8fc0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
8fd0: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
8fe0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
8ff0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
9000: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
9010: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9020: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
9030: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9040: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
9050: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
9060: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
9070: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
9080: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
9090: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
90a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
90b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
90c0: 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20  USIVE || pPg!=0 
90d0: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41  );.  TRACE3("PLA
90e0: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
90f0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
9100: 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ger), pgno);.  i
9110: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9120: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9130: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
9140: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
9150: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
9160: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
9170: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
9180: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
9190: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
91a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
91b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
91c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
91d0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
91e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
91f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9200: 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74 79  pPg ) pPg->dirty
9210: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
9220: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
9230: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
9240: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
9250: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
9260: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
9270: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
9280: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
9290: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
92a0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
92b0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
92c0: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
92d0: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
92e0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
92f0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
9300: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
9310: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
9320: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
9330: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
9340: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
9350: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
9360: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
9370: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
9380: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
9390: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
93a0: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
93b0: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
93c0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
93d0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
93e0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
93f0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
9400: 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
9410: 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46  uctor ){  /*** F
9420: 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74  IX ME:  Should t
9430: 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20  his be xReinit? 
9440: 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ***/.      pPage
9450: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
9460: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9470: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
9480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
9490: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
94a0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
94b0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
94c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
94d0: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
94e0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
94f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
9510: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
9520: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
9530: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9540: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
9550: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
9560: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
9570: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9580: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
9590: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
95a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
95b0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
95c0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
95d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
95e0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
95f0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
9600: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
9610: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9620: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
9630: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
9640: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
9650: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
9660: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
9670: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
9680: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
9690: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
96a0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
96b0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
96c0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
96d0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
96e0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
96f0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
9700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
9710: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
9720: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9730: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
9740: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
9750: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
9760: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
9770: 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74  ;.  OsFile *mast
9780: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
9790: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
97a0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
97b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
97c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
97d0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
97e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
97f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9800: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
9810: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
9820: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
9830: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
9840: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9850: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
9860: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
9870: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
9880: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
9890: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
98a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
98b0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
98c0: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
98d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
98e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
98f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
9900: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  ter_open = 1;.  
9910: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
9920: 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26  leSize(master, &
9930: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
9940: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9950: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
9960: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
9970: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
9980: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
9990: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
99a0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
99b0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   0;..    /* Load
99c0: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
99d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
99e0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
99f0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
9a00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
9a10: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
9a20: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
9a30: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
9a40: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
9a50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
9a60: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
9a70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  l);.    if( !zMa
9a80: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9a90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9aa0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
9ab0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9ad0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d   sqlite3OsRead(m
9ae0: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
9af0: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
9b00: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9b10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9b20: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9b30: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
9b40: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
9b50: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
9b60: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
9b70: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
9b80: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
9b90: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
9ba0: 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61  leExists(zJourna
9bb0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  l) ){.        /*
9bc0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
9bd0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
9be0: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
9bf0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
9c00: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
9c10: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
9c20: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
9c30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
9c40: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
9c50: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
9c60: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
9c70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9c80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9c90: 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75       OsFile *jou
9ca0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
9cb0: 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20    int c;..      
9cc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9cd0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
9ce0: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
9cf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9d00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9d10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9d20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9d30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9d40: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
9d50: 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20  ournal(journal, 
9d60: 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  &zMasterPtr);.  
9d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
9d80: 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a  lose(&journal);.
9d90: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9da0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9db0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9dc0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9dd0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
9de0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20  = zMasterPtr!=0 
9df0: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
9e00: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
9e10: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
9e20: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  eFree(zMasterPtr
9e30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
9e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9e50: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
9e60: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
9e70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9e80: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
9e90: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9ea0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9eb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9ec0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
9ed0: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
9ee0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9ef0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  .  sqlite3OsDele
9f00: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
9f10: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
9f20: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
9f30: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
9f40: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
9f50: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
9f60: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
9f70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9f80: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
9f90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9fa0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
9fb0: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
9fc0: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
9fd0: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
9fe0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9ff0: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
a000: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
a010: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
a020: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
a030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a040: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
a050: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
a060: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
a070: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
a080: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
a090: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
a0a0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a0b0: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
a0c0: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
a0d0: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
a0e0: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
a0f0: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
a100: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
a110: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
a120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a130: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
a140: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a150: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
a160: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a170: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
a180: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
a190: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
a1a0: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  ll){.    char zB
a1b0: 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  uf[SQLITE_MAX_PA
a1c0: 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66  GE_SIZE];.    if
a1d0: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
a1e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a1f0: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
a200: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
a210: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
a220: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
a230: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ek(pPager->fd, p
a240: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a250: 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
a260: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  1));.      if( r
a270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a280: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a290: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
a2a0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a2b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
a2d0: 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64  ACE3("REFETCH %d
a2e0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
a2f0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
a300: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
a310: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
a320: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
a330: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
a340: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
a350: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
a360: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
a370: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a380: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
a390: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
a3a0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
a3b0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a3c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
a3d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
a3e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3f0: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
a400: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a410: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
a420: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
a430: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a440: 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
a450: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a460: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a480: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
a490: 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
a4a0: 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
a4b0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
a4c0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
a4d0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
a4e0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a4f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a500: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a510: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a520: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a530: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  g);.#endif.  }. 
a540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a550: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
a560: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
a570: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
a580: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a590: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
a5a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a5b0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
a5c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a5d0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
a5e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a5f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a600: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
a610: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a620: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
a630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a640: 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a  (i64)nPage);.}..
a650: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
a660: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
a670: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
a680: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
a690: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
a6a0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
a6b0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
a6c0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
a6d0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
a6e0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
a6f0: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
a700: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
a710: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
a720: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a730: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
a740: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a750: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a760: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
a770: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
a780: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
a790: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
a7a0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
a7b0: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
a7c0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
a7d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
a7e0: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
a7f0: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
a800: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
a810: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
a820: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
a830: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
a840: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
a850: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
a860: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
a870: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a880: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
a890: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
a8a0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
a8b0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
a8c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
a8d0: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
a8e0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
a8f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a900: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
a910: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
a920: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
a930: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
a940: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
a950: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
a960: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
a970: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
a980: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
a990: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
a9a0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
a9b0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
a9c0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
a9d0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
a9e0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
a9f0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
aa00: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
aa10: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
aa20: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
aa30: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
aa40: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
aa50: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
aa60: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
aa70: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
aa80: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
aa90: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
aaa0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
aab0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
aac0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
aad0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
aae0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
aaf0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
ab00: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
ab10: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
ab20: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
ab30: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
ab40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
ab50: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
ab60: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
ab70: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
ab80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
ab90: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
aba0: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
abb0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
abc0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
abd0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
abe0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
abf0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
ac00: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
ac10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
ac20: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
ac30: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
ac40: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
ac50: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
ac60: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ac70: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
ac80: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
ac90: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
aca0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
acb0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
acc0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
acd0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
ace0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
acf0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
ad00: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
ad10: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
ad20: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
ad30: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
ad40: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
ad50: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
ad60: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
ad70: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
ad80: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
ad90: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
ada0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
adb0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
adc0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
add0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
ade0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
adf0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
ae00: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
ae10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
ae20: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
ae30: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
ae40: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
ae50: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
ae60: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
ae70: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
ae80: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
ae90: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
aea0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
aeb0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
aec0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
aed0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
aee0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
aef0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
af00: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
af10: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
af20: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
af30: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
af40: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
af50: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
af60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af70: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
af80: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
af90: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
afa0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
afb0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
afc0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
afd0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
afe0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
aff0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
b000: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
b010: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
b020: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
b030: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
b040: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
b050: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
b060: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
b070: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
b080: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
b090: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
b0a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
b0b0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
b0c0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
b0d0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b0e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b0f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b100: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b110: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
b120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b130: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b140: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
b150: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b170: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
b180: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
b190: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b1c0: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
b1d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
b1e0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
b1f0: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
b200: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
b230: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
b240: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
b250: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
b260: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
b270: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
b280: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
b290: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b2a0: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b2b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
b2c0: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
b2d0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
b2e0: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
b2f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b300: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
b310: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b320: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b330: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
b340: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b350: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
b360: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
b370: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
b380: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b390: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b3a0: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
b3b0: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
b3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b3d0: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
b3e0: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
b3f0: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
b400: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
b410: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
b420: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
b430: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
b440: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
b450: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
b460: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
b470: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
b480: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
b490: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b4a0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
b4b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
b4c0: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
b4d0: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
b4e0: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
b4f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
b500: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
b510: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b530: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
b540: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
b550: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
b560: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
b570: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
b580: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b590: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
b5a0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
b5b0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
b5c0: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
b5d0: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
b5e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
b5f0: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
b600: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
b610: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
b620: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
b630: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
b640: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b650: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
b660: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
b670: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
b680: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b690: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
b6a0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
b6b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
b6c0: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
b6d0: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
b6e0: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
b6f0: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
b700: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
b710: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
b720: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
b730: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
b740: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
b750: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
b760: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
b770: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b780: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
b790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
b7a0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
b7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b7c0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
b7d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
b7e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
b7f0: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
b800: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
b810: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
b820: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
b830: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
b840: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
b850: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
b860: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
b870: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
b880: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
b890: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
b8a0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
b8b0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
b8c0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
b8d0: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
b8e0: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
b8f0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
b900: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
b910: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
b920: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b930: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
b940: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
b950: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
b960: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
b970: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
b980: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
b990: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
b9a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
b9b0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
b9c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
b9d0: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
b9e0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
b9f0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
ba00: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
ba10: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
ba20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
ba30: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ba40: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
ba50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ba60: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
ba70: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
ba80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ba90: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
baa0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bab0: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bac0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bad0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bae0: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
baf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bb00: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bb10: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bb20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bb30: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bb40: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bb50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
bb60: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bb70: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bb80: 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20  pPager)); */.   
bb90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bba0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  OK ) goto end_pl
bbb0: 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f  ayback;.  .    /
bbc0: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
bbd0: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
bbe0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
bbf0: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
bc00: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
bc10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bc20: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
bc30: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
bc40: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
bc50: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
bc60: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
bc70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bc80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
bc90: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bcb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bcc0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bcd0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
bce0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bcf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bd00: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
bd10: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bd20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bd30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
bd40: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
bd50: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
bd60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
bd70: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
bd80: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
bd90: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
bda0: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
bdb0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
bdc0: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
bdd0: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
bde0: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
bdf0: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
be00: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
be10: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
be20: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
be30: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
be40: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
be50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
be60: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
be70: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
be80: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
be90: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
bea0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
beb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
bec0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
bed0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
bee0: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
bef0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
bf00: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
bf10: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
bf20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
bf30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf40: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
bf50: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bf70: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
bf80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
bf90: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
bfa0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
bfb0: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
bfc0: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
bfd0: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
bfe0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
bff0: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c000: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c010: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c020: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c030: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c040: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c050: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c060: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c070: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c080: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c0a0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c0b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c0c0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c0d0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c0e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c0f0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c100: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c110: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c120: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c140: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c150: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c160: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c170: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c180: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c190: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c1a0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c1b0: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c1c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c1d0: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c1e0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c1f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c200: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c210: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c220: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c230: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c240: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c250: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c260: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c280: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c290: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c2a0: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c2d0: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c2e0: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c2f0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c310: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c320: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c340: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c350: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c370: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c380: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c390: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c3a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c3b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c3c0: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
c3d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c3e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c3f0: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
c400: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
c410: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
c420: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
c430: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
c440: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c450: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
c460: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
c470: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
c480: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
c490: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
c4a0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
c4b0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
c4c0: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
c4d0: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
c4e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
c4f0: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
c500: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
c510: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
c520: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
c530: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
c540: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
c550: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
c560: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
c570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
c580: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
c590: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
c5a0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
c5b0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
c5c0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
c5d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
c5e0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
c5f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c600: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
c610: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
c620: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
c630: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
c640: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
c650: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
c660: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
c670: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
c680: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
c690: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
c6a0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
c6b0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c6c0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
c6d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
c6e0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c6f0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c700: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
c710: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c720: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
c730: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
c740: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
c750: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
c760: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
c770: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
c780: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
c790: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
c7a0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
c7b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
c7c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c7d0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c7e0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
c7f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c800: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
c810: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c820: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
c830: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
c840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
c850: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
c860: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
c870: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
c880: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
c890: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
c8a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c8b0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
c8c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
c8d0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
c8e0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
c8f0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
c900: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
c910: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
c920: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
c930: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
c940: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
c950: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
c960: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
c970: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
c980: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c990: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
c9a0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c9b0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
c9c0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
c9d0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
c9e0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
c9f0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
ca00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ca10: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
ca20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
ca40: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ca50: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
ca60: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
ca70: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
ca80: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
ca90: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
caa0: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65  tmtCksum;.  asse
cab0: 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  rt( JOURNAL_HDR_
cac0: 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67  SZ(pPager)<(pPag
cad0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20  er->pageSize+8) 
cae0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  );.  while( pPag
caf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
cb00: 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65  = (hdrOff-(pPage
cb10: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20  r->pageSize+8)) 
cb20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cb30: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cb40: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
cb50: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
cb60: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
cb70: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
cb80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cb90: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
cba0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
cbb0: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
cbc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
cbd0: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52  zJ ){.    u32 nR
cbe0: 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d  ec;.    u32 dumm
cbf0: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
cc00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
cc10: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
cc20: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
cc30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cc40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
cc50: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
cc70: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cc80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
cc90: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
cca0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
ccc0: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
ccd0: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
cce0: 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b     for(i=nRec-1;
ccf0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
cd00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cd10: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
cd20: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cd30: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cd40: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cd50: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cd60: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cd70: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
cd80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cd90: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cda0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cdb0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cdc0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cdd0: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cde0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
cdf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ce00: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
ce10: 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  (pPager, SQLITE_
ce20: 43 4f 52 52 55 50 54 29 3b 0a 20 20 7d 65 6c 73  CORRUPT);.  }els
ce30: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
ce40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ce50: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
ce60: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
ce70: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
ce80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ce90: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
cea0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ceb0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
cec0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ced0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
cee0: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
cef0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
cf00: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
cf10: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
cf20: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
cf30: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
cf40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
cf50: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
cf60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
cf70: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
cf80: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
cf90: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
cfa0: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
cfb0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
cfc0: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
cfd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
cfe0: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
cff0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d000: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
d010: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
d020: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
d030: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
d040: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
d050: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
d060: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
d070: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d080: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
d090: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
d0a0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
d0b0: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
d0c0: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
d0d0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
d0e0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d100: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
d110: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
d120: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
d130: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d140: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
d150: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
d160: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
d170: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
d180: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
d190: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
d1a0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
d1b0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d1d0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
d1e0: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
d1f0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d200: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d210: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
d220: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d230: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
d240: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
d250: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
d260: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
d270: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d280: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
d290: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
d2a0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
d2b0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
d2c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d2d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
d2e0: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
d2f0: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
d300: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
d310: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
d320: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
d330: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
d350: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
d360: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
d370: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
d380: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
d390: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
d3a0: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
d3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
d3c0: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
d3e0: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
d3f0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d400: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
d410: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
d420: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
d430: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
d440: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
d450: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
d460: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
d470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d480: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
d490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d4a0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
d4b0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
d4c0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
d4d0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d4e0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
d4f0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d500: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
d510: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
d520: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
d530: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
d540: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
d550: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
d560: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d570: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d580: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
d590: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
d5a0: 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
d5b0: 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
d5c0: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
d5d0: 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
d5e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
d5f0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
d600: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d610: 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  only.  .*/.int s
d620: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
d630: 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  count = 0;../*.*
d640: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
d650: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
d660: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d670: 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a  file into zFile.
d680: 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62  ** (zFile must b
d690: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
d6a0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
d6b0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
d6c0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
d6d0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
d6e0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
d6f0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d700: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
d710: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
d720: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
d730: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
d740: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
d750: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
d760: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
d770: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
d780: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
d790: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
d7a0: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
d7b0: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
d7c0: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
d7d0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  c;.  sqlite3_ope
d7e0: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
d7f0: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
d800: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d810: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20   only */.  do{. 
d820: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
d830: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
d840: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
d850: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
d860: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
d870: 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77  e, pFd, 1);.  }w
d880: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
d890: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
d8a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
d8b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
d8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
d8d0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
d8e0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
d8f0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
d900: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
d910: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
d920: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
d930: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
d940: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
d950: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
d960: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
d970: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
d980: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
d990: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
d9a0: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
d9b0: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
d9c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
d9d0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
d9e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d9f0: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
da00: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
da10: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
da20: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
da30: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
da40: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
da50: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
da60: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
da70: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
da80: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
da90: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
daa0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
dab0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
dac0: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
dad0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
dae0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
daf0: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
db00: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
db10: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
db20: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
db30: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28  lite3pager_open(
db40: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
db50: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
db60: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
db70: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
db80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
db90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
dba0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
dbb0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
dbc0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
dbd0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
dbe0: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
dbf0: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
dc00: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
dc10: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
dc30: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
dc40: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
dc50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
dc60: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
dc70: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  llPathname = 0;.
dc80: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20    int nameLen;. 
dc90: 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69   OsFile *fd;.  i
dca0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dcb0: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
dcc0: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
dcd0: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
dce0: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
dcf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
dd00: 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
dd10: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
dd20: 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
dd30: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
dd40: 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
dd50: 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68  ADLOCK)!=0;.  ch
dd60: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
dd70: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
dd80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd90: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
dda0: 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
ddb0: 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
ddc0: 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
ddd0: 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
dde0: 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
ddf0: 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
de00: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
de10: 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
de20: 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
de30: 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
de40: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
de50: 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
de60: 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
de70: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
de80: 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
de90: 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
dea0: 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
deb0: 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65  set. It would be
dec0: 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a   nice to assert.
ded0: 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64    ** that Thread
dee0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e  Data.nAlloc is n
def0: 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61  on-zero, but ala
df00: 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65  s this breaks te
df10: 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77  st cases .  ** w
df20: 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  ritten to invoke
df30: 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63   the pager direc
df40: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  tly..  */.  Thre
df50: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
df60: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
df70: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ();.  assert( pT
df80: 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  sd );.#endif..  
df90: 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68  /* If malloc() h
dfa0: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
dfb0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
dfc0: 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76  NOMEM. Before ev
dfd0: 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  en.  ** testing 
dfe0: 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70  for this, set *p
dff0: 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73  pPager to NULL s
e000: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f  o the caller kno
e010: 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  ws the pager.  *
e020: 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73 20  * structure was 
e030: 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e  never allocated.
e040: 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65   .  */.  *ppPage
e050: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
e060: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
e070: 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  () ){.    return
e080: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e090: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c   }.  memset(&fd,
e0a0: 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b   0, sizeof(fd));
e0b0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
e0c0: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
e0d0: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
e0e0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
e0f0: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
e100: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
e110: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
e120: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
e130: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
e140: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
e150: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
e160: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
e170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e180: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
e190: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
e1a0: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
e1b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
e1c0: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
e1d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e1e0: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
e1f0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
e200: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
e210: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e220: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
e230: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
e240: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
e250: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
e260: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
e270: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
e280: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
e290: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
e2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
e2b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
e2c0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
e2d0: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
e2e0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
e2f0: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
e300: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e310: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e320: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e330: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e340: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
e350: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
e360: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
e370: 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  te the Pager str
e380: 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20  ucture. As part 
e390: 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f  of the same allo
e3a0: 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65  cation, allocate
e3b0: 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  .  ** space for 
e3c0: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f  the full paths o
e3d0: 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65  f the file, dire
e3e0: 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61  ctory and journa
e3f0: 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a  l .  ** (Pager.z
e400: 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e  Filename, Pager.
e410: 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50  zDirectory and P
e420: 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a  ager.zJournal)..
e430: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
e440: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
e450: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
e460: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e470: 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
e480: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
e490: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
e4a0: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
e4b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
e4c0: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
e4d0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
e4e0: 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
e4f0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20  e the memory .  
e500: 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
e510: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   zFullPathname, 
e520: 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  free the Pager s
e530: 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
e540: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c  se the .  ** fil
e550: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  e. Since the pag
e560: 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
e570: 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
e580: 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
e590: 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
e5a0: 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
e5b0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
e5c0: 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e  r || !zFullPathn
e5d0: 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ame || rc!=SQLIT
e5e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
e5f0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
e600: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e610: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e620: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e630: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
e640: 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
e650: 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  OK)?SQLITE_NOMEM
e660: 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41  :rc);.  }..  TRA
e670: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
e680: 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
e690: 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  (fd), zFullPathn
e6a0: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ame);.  pPager->
e6b0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
e6c0: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
e6d0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e6e0: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
e6f0: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
e700: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
e710: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
e720: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
e730: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
e740: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
e750: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
e760: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
e770: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e780: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
e790: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65  );..  for(i=name
e7a0: 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67  Len; i>0 && pPag
e7b0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e7c0: 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
e7d0: 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
e7e0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
e7f0: 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63  i-1] = 0;.  strc
e800: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
e810: 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  nal, zFullPathna
e820: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
e830: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e840: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
e850: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
e860: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
e870: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
e880: 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67   = fd;.  /* pPag
e890: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
e8a0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
e8b0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
e8c0: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
e8d0: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
e8e0: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
e8f0: 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
e900: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
e910: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
e920: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
e930: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
e940: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
e950: 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
e960: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
e970: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
e980: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
e990: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
e9a0: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
e9b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
e9c0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
e9d0: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
e9e0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
e9f0: 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
ea00: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  /* pPager->nMaxP
ea10: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
ea20: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
ea30: 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  00;.  assert( PA
ea40: 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  GER_UNLOCK==0 );
ea50: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
ea60: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
ea70: 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
ea80: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
ea90: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
eaa0: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
eab0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
eac0: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
ead0: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
eae0: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
eaf0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
eb00: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
eb10: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
eb20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
eb30: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
eb40: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
eb50: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
eb60: 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61  c?0:1);.  /* pPa
eb70: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
eb80: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
eb90: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
eba0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
ebb0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
ebc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
ebd0: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
ebe0: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70  ENT(nExtra);.  p
ebf0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ec00: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
ec10: 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
ec20: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
ec30: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
ec40: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
ec50: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
ec60: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
ec70: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
ec80: 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51  Pager;.#ifdef SQ
ec90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
eca0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
ecb0: 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
ecc0: 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20  pTsd->pPager;.  
ecd0: 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
ece0: 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
ecf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ed00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ed10: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
ed20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
ed30: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
ed40: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
ed50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
ed60: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
ed70: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
ed80: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
ed90: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
eda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
edb0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
edc0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
edd0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
ede0: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
edf0: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
ee00: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
ee10: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
ee20: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
ee30: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
ee40: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
ee50: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
ee60: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
ee70: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
ee80: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
ee90: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
eea0: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
eeb0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
eec0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
eed0: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
eee0: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
eef0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
ef00: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
ef10: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
ef20: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
ef30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ef40: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
ef50: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
ef60: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
ef70: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
ef80: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
ef90: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
efa0: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
efb0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
efc0: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
efd0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
efe0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
eff0: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
f000: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f010: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
f020: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
f030: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
f040: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
f050: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
f060: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
f070: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
f080: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
f090: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
f0a0: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
f0b0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
f0c0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f0d0: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
f0f0: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
f100: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
f110: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
f120: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
f130: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
f140: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
f150: 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
f160: 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
f170: 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
f180: 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
f190: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
f1a0: 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
f1b0: 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
f1c0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
f1d0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67  te3pager_set_pag
f1e0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
f1f0: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
f200: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
f210: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
f220: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
f230: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
f240: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
f250: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
f260: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
f270: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  pageSize;.  }.  
f280: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
f290: 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
f2a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f2b0: 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
f2c0: 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
f2d0: 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
f2e0: 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
f2f0: 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
f300: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
f310: 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
f320: 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
f330: 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
f340: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
f350: 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
f360: 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
f370: 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
f380: 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
f390: 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
f3a0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
f3b0: 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
f3c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f3d0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
f3e0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f3f0: 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
f400: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f410: 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
f420: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
f430: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
f440: 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73  _io_error(){.  s
f450: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f460: 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20  hit = 0;.}.void 
f470: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
f480: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
f490: 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
f4a0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f4b0: 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
f4c0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f4d0: 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
f4e0: 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
f4f0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
f500: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
f510: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
f520: 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
f530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c  else.# define cl
f540: 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
f550: 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e  _error().# defin
f560: 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
f570: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
f580: 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
f590: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f5a0: 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
f5b0: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
f5c0: 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
f5d0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f5e0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
f5f0: 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
f600: 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
f610: 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
f620: 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
f630: 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
f640: 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
f650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
f660: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
f670: 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
f680: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
f690: 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
f6a0: 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
f6b0: 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
f6c0: 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
f6d0: 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
f6e0: 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
f6f0: 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
f700: 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
f710: 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
f720: 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
f730: 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
f740: 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
f750: 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
f760: 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
f770: 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
f780: 20 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20   this)..*/.void 
f790: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61  sqlite3pager_rea
f7a0: 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67  d_fileheader(Pag
f7b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f7c0: 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
f7d0: 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73   *pDest){.  mems
f7e0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
f7f0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
f800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
f810: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
f820: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f830: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
f840: 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20  d, pDest, N);.  
f850: 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65    clear_simulate
f860: 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20  d_io_error();.  
f870: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f880: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
f890: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
f8a0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
f8b0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
f8c0: 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
f8d0: 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
f8e0: 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
f8f0: 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
f900: 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
f910: 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
f920: 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
f930: 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
f940: 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
f950: 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
f960: 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
f970: 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
f980: 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
f990: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
f9a0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
f9b0: 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
f9c0: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
f9d0: 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
f9e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
f9f0: 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
fa00: 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
fa10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
fa20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
fa30: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
fa40: 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
fa50: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
fa60: 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e {.    if( sqli
fa70: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
fa80: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
fa90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
faa0: 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
fab0: 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f 45  ager, SQLITE_IOE
fac0: 52 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  RR);.      retur
fad0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
fae0: 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
faf0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
fb00: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
fb10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
fb20: 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
fb30: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
fb40: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
fb50: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
fb60: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
fb70: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
fb80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
fb90: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
fba0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
fbb0: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
fbc0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
fbd0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
fbe0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
fbf0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
fc00: 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  l(Pager*);.../*.
fc10: 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
fc20: 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
fc30: 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
fc40: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
fc50: 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
fc60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
fc70: 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
fc80: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
fc90: 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
fca0: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
fcb0: 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
fcc0: 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
fcd0: 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
fce0: 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
fcf0: 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
fd00: 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
fd10: 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
fd20: 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
fd30: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
fd40: 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
fd50: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
fd60: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
fd70: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  gno==0 ){.    /*
fd80: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
fd90: 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ber is zero, the
fda0: 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e  n this page is n
fdb0: 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63  ot in any hash c
fdc0: 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  hain. */.    ret
fdd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
fde0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
fdf0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
fe00: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
fe10: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
fe20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
fe30: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
fe40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
fe50: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
fe60: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70  h(pPg->pgno)]!=p
fe70: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
fe80: 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
fe90: 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
fea0: 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
feb0: 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72     int h = pager
fec0: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
fed0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fee0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
fef0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
ff00: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
ff10: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
ff20: 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  }..  pPg->pgno =
ff30: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
ff40: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
ff50: 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
ff60: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
ff70: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
ff80: 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
ff90: 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
ffa0: 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
ffb0: 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
ffc0: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
ffd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ffe0: 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
fff0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
10000 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
10010 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
10020 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
10030 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
10040 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
10050 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
10060 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
10070 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
10080 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
10090 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
100a0 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
100b0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
100c0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
100d0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
100e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
100f0 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
10100 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
10110 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
10120 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
10130 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10140 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
10150 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
10160 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
10170 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10180 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
10190 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
101a0 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
101b0 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
101c0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
101d0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
101e0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
101f0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
10200 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10220 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
10230 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
10240 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10250 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
10260 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10270 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
10280 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10290 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
102a0 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
102b0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
102c0 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
102d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
102e0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
102f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10300 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
10310 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10320 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
10330 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
10340 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
10350 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10360 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
10370 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
10380 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
10390 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
103a0 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
103b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
103c0 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
103d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
103e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
103f0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
10400 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
10410 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
10420 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
10430 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
10440 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
10450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
10460 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
10470 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
10480 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10490 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
104a0 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
104b0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
104c0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
104d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
104e0 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
104f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
10500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10510 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
10520 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
10530 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
10540 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10550 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
10560 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
10570 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
10580 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
10590 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
105a0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
105b0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
105c0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
105d0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
105e0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
105f0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
10600 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
10610 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
10620 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
10630 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
10640 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
10650 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
10660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10670 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
10680 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
10690 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
106a0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
106b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
106c0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
106d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
106e0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
106f0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
10700 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
10710 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
10720 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
10730 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
10740 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10750 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
10760 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
10770 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
10780 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
10790 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
107a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
107b0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
107c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
107d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
107e0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
107f0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
10800 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
10810 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
10820 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
10830 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
10840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
10860 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
10870 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
10880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10890 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
108a0 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
108b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
108c0 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
108d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
108e0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
108f0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
10900 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10910 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
10920 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
10930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
10940 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
10950 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
10960 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10970 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
10980 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
10990 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
109a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
109b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
109c0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
109d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
109e0 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
109f0 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
10a00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10a10 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
10a20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
10a30 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
10a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
10a60 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
10a70 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
10a80 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
10a90 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
10aa0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
10ab0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
10ac0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
10ad0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
10ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10af0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10b00 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
10b10 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
10b20 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
10b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10b50 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
10b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10b70 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
10b80 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
10b90 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
10ba0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
10bb0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
10bc0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
10bd0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
10be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10bf0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
10c00 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
10c10 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
10c20 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
10c30 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
10c40 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
10c50 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
10c60 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
10c70 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
10c80 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
10c90 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
10ca0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
10cb0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
10cc0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
10cd0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
10ce0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10cf0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
10d00 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
10d10 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
10d20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
10d30 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
10d40 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
10d50 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
10d60 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
10d70 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
10d80 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
10d90 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
10da0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
10db0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
10dc0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
10dd0 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
10de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10df0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
10e00 4e 65 78 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  Next;.#ifdef SQL
10e10 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
10e20 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
10e30 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
10e40 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
10e50 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
10e60 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
10e70 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
10e80 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
10e90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
10ea0 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
10eb0 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
10ec0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
10ed0 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
10ee0 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
10ef0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
10f00 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
10f10 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
10f20 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
10f30 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  an be set..  */.
10f40 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
10f50 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
10f60 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
10f70 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20  rt( pPager );.  
10f80 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20  assert( pTsd && 
10f90 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  pTsd->nAlloc );.
10fa0 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
10fb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
10fc0 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
10fd0 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20  R_RESERVED:.    
10fe0 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45  case PAGER_SYNCE
10ff0 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47  D: .    case PAG
11000 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a  ER_EXCLUSIVE: {.
11010 20 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f        /* We igno
11020 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73  re any IO errors
11030 20 74 68 61 74 20 6f 63 63 75 72 20 64 75 72 69   that occur duri
11040 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  ng the rollback.
11050 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69        ** operati
11060 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49  on. So disable I
11070 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69  O error simulati
11080 6f 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74 69  on so that testi
11090 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b  ng.      ** work
110a0 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20  s more easily.. 
110b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 69       */.      di
110c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
110d0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
110e0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
110f0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
11100 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 5f 73  ;.      enable_s
11110 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11120 72 73 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rs();.      if( 
11130 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
11140 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
11150 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
11160 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
11170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11180 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
11190 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
111a0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
111b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
111c0 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
111d0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
111e0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
111f0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
11200 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
11210 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
11220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11230 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
11240 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
11250 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
11260 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11270 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
11280 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
11290 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65  g=pNext){.#ifnde
112a0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28  f NDEBUG.    if(
112b0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
112c0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
112d0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
112e0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
112f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
11300 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
11310 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
11320 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
11330 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11340 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
11350 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
11360 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
11370 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
11380 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
11390 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c    }.  TRACE2("CL
113a0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
113b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61  ID(pPager));.  a
113c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
113d0 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65  rrCode || (pPage
113e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
113f0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d  0 && pPager->stm
11400 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  tOpen==0) );.  i
11410 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
11420 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
11430 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11440 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
11450 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
11460 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
11470 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11480 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
11490 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
114a0 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
114b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c   }.  sqlite3OsCl
114c0 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
114d0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
114e0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
114f0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
11500 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
11510 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11520 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
11530 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
11540 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
11550 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65  ** }.  */..#ifde
11560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11570 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
11580 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  T.  /* Remove th
11590 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65  e pager from the
115a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
115b0 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20  pagers starting 
115c0 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  at .  ** ThreadD
115d0 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65  ata.pPager if me
115e0 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
115f0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f  is enabled..  */
11600 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70  .  if( pPager==p
11610 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  Tsd->pPager ){. 
11620 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20     pTsd->pPager 
11630 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
11640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
11650 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66  ger *pTmp;.    f
11660 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e  or(pTmp = pTsd->
11670 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e  pPager; pTmp->pN
11680 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d  ext!=pPager; pTm
11690 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 3b 0a  p=pTmp->pNext);.
116a0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
116b0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
116c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
116d0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
116e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
116f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11700 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
11710 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
11720 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
11730 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70  */.Pgno sqlite3p
11740 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
11750 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
11760 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
11770 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11780 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
11790 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
117a0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
117b0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
117c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
117d0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
117e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
117f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11800 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
11810 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11820 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
11830 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
11840 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
11850 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
11860 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11870 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
11880 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
11890 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
118a0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
118b0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
118c0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
118d0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
118e0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
118f0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
11900 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
11910 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
11920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11930 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
11940 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
11950 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
11960 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
11970 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11980 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
11990 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
119a0 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
119b0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
119c0 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
119d0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
119e0 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
119f0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
11a00 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
11a10 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
11a20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
11a30 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
11a40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11a50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
11a60 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
11a70 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
11a80 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
11a90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11aa0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11ab0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
11ac0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
11ad0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
11ae0 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
11af0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
11b00 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
11b10 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
11b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11b30 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
11b40 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11b50 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
11b60 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
11b70 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
11b80 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
11b90 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
11ba0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
11bb0 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
11bc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
11bd0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
11be0 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
11bf0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
11c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11c10 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
11c20 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
11c30 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
11c40 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
11c50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
11c60 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
11c70 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
11c80 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11c90 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
11ca0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
11cb0 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
11cc0 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
11cd0 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
11ce0 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
11cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11d00 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70  ager_ref(void *p
11d10 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11d20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11d30 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61  HDR(pData);.  pa
11d40 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
11d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
11d70 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
11d80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
11d90 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
11da0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
11db0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
11dc0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
11dd0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
11de0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
11df0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
11e00 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
11e10 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
11e20 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11e30 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
11e40 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
11e50 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
11e60 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
11e70 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
11e80 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
11e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
11ea0 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
11eb0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
11ec0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
11ed0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
11ee0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
11ef0 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
11f00 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
11f10 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
11f20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
11f30 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
11f40 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
11f50 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
11f60 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
11f70 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
11f80 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
11f90 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
11fa0 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
11fb0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
11fc0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
11fd0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
11fe0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
11ff0 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
12000 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
12010 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
12020 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
12030 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
12040 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
12050 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12060 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
12070 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
12080 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
12090 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
120a0 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
120b0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
120c0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
120d0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
120e0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
120f0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
12110 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
12120 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
12130 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
12140 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
12150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12160 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
12170 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
12180 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
12190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
121a0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
121b0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
121c0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
121d0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
121e0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
121f0 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
12200 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
12210 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
12220 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
12230 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
12240 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12250 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12260 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12270 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
12280 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
12290 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
122a0 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
122b0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
122c0 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
122d0 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
122e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
122f0 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
12300 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
12310 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
12320 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
12330 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
12340 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
12350 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
12360 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
12370 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
12380 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
12390 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
123a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
123b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
123c0 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
123d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
123e0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
123f0 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
12400 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
12440 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
12450 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
12460 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
12470 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
12480 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
12490 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
124a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
124b0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
124c0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
124d0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
124e0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
124f0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
12500 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
12510 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
12520 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
12530 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
12540 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
12550 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
12560 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
12570 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
12580 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
12590 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
125a0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
125b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
125c0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
125d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
125e0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
125f0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
12600 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12620 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
12630 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12640 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12670 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
12680 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
12690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
126a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
126b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
126c0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
126d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
126e0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
126f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12700 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12710 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12720 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
12740 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
12750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12760 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
12770 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12780 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12790 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
127a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
127b0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
127c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29  Pager->fullSync)
127d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
127e0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
127f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12800 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
12810 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
12820 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
12830 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
12840 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
12850 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
12860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
12870 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
12880 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
12890 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
128a0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
128b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
128c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
128d0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
128e0 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
128f0 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
12900 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
12910 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
12920 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
12930 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
12940 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
12950 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
12960 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
12970 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
12980 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
12990 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
129a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
129b0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
129c0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
129d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
129e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
129f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
12a00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
12a10 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
12a20 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
12a30 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
12a40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
12a50 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
12a60 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
12a70 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
12a80 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
12a90 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
12aa0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
12ab0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
12ac0 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
12ad0 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
12ae0 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
12af0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
12b00 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
12b10 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
12b20 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
12b30 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
12b40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
12b50 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
12b60 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
12b70 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
12b80 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
12b90 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
12ba0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
12bb0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
12bc0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
12bd0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
12be0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
12bf0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
12c00 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
12c10 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
12c20 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
12c30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
12c40 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
12c50 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
12c60 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
12c70 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
12c80 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
12c90 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
12ca0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
12cb0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
12cc0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
12cd0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
12ce0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
12cf0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
12d00 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
12d10 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
12d20 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
12d30 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
12d40 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
12d50 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
12d60 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
12d70 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
12d80 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
12d90 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
12da0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
12db0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
12dc0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
12dd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12de0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
12df0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
12e00 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
12e10 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
12e20 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
12e30 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
12e40 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12e50 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
12e60 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
12e70 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
12e80 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
12e90 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
12ea0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
12eb0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
12ec0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
12ed0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
12ee0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
12ef0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12f00 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
12f10 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
12f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12f30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12f40 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
12f50 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
12f60 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
12f70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12f80 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
12f90 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
12fa0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
12fb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12fc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12fd0 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
12fe0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
12ff0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
13000 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
13010 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
13020 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
13030 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
13040 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67  means sqlite3pag
13050 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61  er_truncate() wa
13060 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
13070 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
13080 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
13090 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
130a0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
130b0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
130c0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
130d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
130e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
130f0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
13100 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43  bSize ){.      C
13110 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
13120 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13130 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13140 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
13150 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
13160 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13170 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13180 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
13190 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
131a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
131b0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
131c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
131e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
131f0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
13200 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
13210 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
13220 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  t->pgno, 0);.   
13230 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
13240 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
13250 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
13260 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
13270 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
13280 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
13290 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
132a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
132b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
132c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
132d0 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
132e0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
132f0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13300 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
13310 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
13320 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
13330 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
13340 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
13350 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
13360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13370 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
13380 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
13390 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
133a0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
133b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
133c0 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
133d0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
133e0 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
133f0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
13400 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
13410 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
13420 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
13430 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
13440 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
13450 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
13460 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
13470 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
13480 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
13490 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
134a0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
134b0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
134c0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
134d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
134e0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
134f0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13500 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13510 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13520 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
13530 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
13540 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
13550 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
13560 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13570 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
13580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13590 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
135a0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
135b0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
135c0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
135d0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
135e0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
135f0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13600 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13610 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13620 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13630 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
13640 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13650 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
13660 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
13670 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
13680 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
13690 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
136a0 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
136b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
136c0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
136d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
136e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
136f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13700 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13710 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13720 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13730 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
13740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
13750 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
13760 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13770 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
13780 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
13790 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
137a0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
137b0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
137c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
137d0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
137e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
137f0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
13800 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
13810 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
13820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13830 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
13840 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
13850 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
13860 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
13870 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
13880 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
13890 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
138a0 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
138b0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
138c0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
138d0 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
138e0 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
138f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
13900 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13910 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
13920 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
13930 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
13940 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
13950 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
13960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13970 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
13980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
13990 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
139a0 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
139b0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
139c0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
139d0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
139e0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
139f0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
13a00 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
13a10 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
13a20 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
13a30 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
13a40 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
13a50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
13a60 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13a70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13a80 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
13a90 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
13aa0 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
13ab0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
13ac0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
13ad0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
13ae0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13af0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
13b00 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
13b10 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
13b20 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
13b30 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
13b40 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
13b50 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
13b60 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
13b70 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
13b80 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
13b90 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
13ba0 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
13bb0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
13bc0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13bd0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
13be0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
13bf0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
13c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13c10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
13c20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
13c30 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
13c40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13c50 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
13c60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13c80 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
13c90 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
13ca0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
13cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cc0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
13cd0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
13ce0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
13cf0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
13d00 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
13d10 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
13d20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
13d30 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13d40 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13d50 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
13d60 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
13d70 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
13d80 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
13d90 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66  t( pPg );.    if
13da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13db0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13dc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
13dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
13de0 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
13df0 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
13e00 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
13e10 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
13e20 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
13e30 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
13e40 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
13e50 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
13e60 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
13e70 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
13e80 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
13e90 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
13ea0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
13eb0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
13ec0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
13ed0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
13ee0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
13ef0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
13f00 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
13f10 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
13f20 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
13f30 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
13f40 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
13f50 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
13f60 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
13f70 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13f80 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
13f90 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
13fa0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13fb0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
13fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13fd0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
13fe0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13ff0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
14000 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
14010 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
14020 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
14030 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
14040 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
14050 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
14060 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14070 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a  er->nOvfl);..  *
14080 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
14090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
140a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
140b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
140c0 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
140d0 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
140e0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
140f0 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
14100 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
14110 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
14120 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
14130 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
14140 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14150 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
14160 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
14170 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
14180 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
14190 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
141a0 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
141b0 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
141c0 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
141d0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
141e0 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
141f0 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
14200 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
14210 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
14220 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14230 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
14240 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
14250 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
14260 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
14270 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14280 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
14290 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
142a0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
142b0 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e  int nReq){.  con
142c0 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
142d0 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54  Tsdro = sqlite3T
142e0 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
142f0 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  y();.  Pager *p;
14300 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
14310 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
14320 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20    /* If the the 
14330 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
14340 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f  held, this subro
14350 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a  utine becomes a.
14360 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20    ** o-op; zero 
14370 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
14380 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73  are freed.  This
14390 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a   is because.  **
143a0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64   some of the cod
143b0 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69  e invoked by thi
143c0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
143d0 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  lso.  ** try to 
143e0 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  obtain the mutex
143f0 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  , resulting in a
14400 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
14410 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49    if( sqlite3OsI
14420 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20  nMutex(0) ){.   
14430 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
14440 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c    /* Outermost l
14450 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20  oop runs for at 
14460 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69  most two iterati
14470 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61  ons. First itera
14480 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79  tion we.  ** try
14490 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20   to find memory 
144a0 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65  that can be rele
144b0 61 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c  ased without cal
144c0 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65  ling fsync(). Se
144d0 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74  cond.  ** iterat
144e0 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20  ion (which only 
144f0 72 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73  runs if the firs
14500 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65  t failed to free
14510 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20   nReq bytes of. 
14520 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70   ** memory) is p
14530 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c  ermitted to call
14540 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69   fsync(). This i
14550 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68  s of course much
14560 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65   more .  ** expe
14570 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nsive..  */.  fo
14580 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b  r(i=0; i<=1; i++
14590 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ){..    /* Loop 
145a0 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
145b0 53 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70  SQLite pagers op
145c0 65 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  ened by the curr
145d0 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20  ent thread. */. 
145e0 20 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d     for(p=pTsdro-
145f0 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e  >pPager; p && (n
14600 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73  Req<0 || nReleas
14610 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70  ed<nReq); p=p->p
14620 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48  Next){.      PgH
14630 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69  dr *pPg;.      i
14640 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt rc;..      /*
14650 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c   For each pager,
14660 20 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20   try to free as 
14670 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f  many pages as po
14680 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20  ssible (without 
14690 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e  .      ** callin
146a0 67 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69  g fsync() if thi
146b0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  s is the first i
146c0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
146d0 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20  outermost .     
146e0 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20   ** loop)..     
146f0 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
14700 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
14710 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
14720 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20  p, i, &pPg)) && 
14730 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  pPg) {.        /
14740 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
14750 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
14760 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14770 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
14780 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
14790 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
147a0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
147b0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
147c0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
147d0 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
147e0 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
147f0 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
14800 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
14810 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
14820 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
14830 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
14840 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
14850 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
14860 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
14870 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
14880 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
14890 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
148a0 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
148b0 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
148c0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
148d0 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
148e0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
148f0 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
14900 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
14910 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
14920 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a  pPg==p->pAll ){.
14930 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41             p->pA
14940 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
14950 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ll;.        }els
14960 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  e{.          for
14970 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20  ( pTmp=p->pAll; 
14980 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d  pTmp->pNextAll!=
14990 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  pPg; pTmp=pTmp->
149a0 70 4e 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20  pNextAll );.    
149b0 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
149c0 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
149d0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tAll;.        }.
149e0 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65          nRelease
149f0 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63  d += sqliteAlloc
14a00 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Size(pPg);.     
14a10 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
14a20 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
14a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14a50 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
14a60 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
14a70 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
14a80 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
14a90 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
14aa0 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
14ab0 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
14ac0 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
14ad0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
14ae0 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
14af0 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
14b00 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
14b10 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
14b20 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
14b30 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
14b40 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
14b50 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
14b60 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
14b70 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
14b80 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
14b90 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
14ba0 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
14bb0 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
14bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
14bd0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
14be0 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
14bf0 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
14c00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
14c10 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
14c20 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
14c30 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
14c40 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
14c50 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14c60 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
14c70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
14c80 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
14c90 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
14ca0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
14cb0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
14cc0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
14cd0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
14ce0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
14cf0 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
14d00 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
14d10 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
14d20 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
14d30 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
14d40 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
14d50 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
14d60 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
14d70 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
14d80 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
14d90 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
14da0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
14db0 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
14dc0 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
14dd0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
14de0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
14df0 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
14e00 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
14e10 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
14e20 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
14e30 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
14e40 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
14e50 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
14e60 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
14e70 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
14e80 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
14e90 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
14ea0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
14eb0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
14ec0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
14ed0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14ee0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
14ef0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
14f00 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
14f10 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
14f20 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  o sqlite3pager_l
14f30 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
14f40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
14f50 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
14f60 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
14f70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
14f80 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
14f90 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
14fa0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
14fb0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
14fc0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
14fd0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
14fe0 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
14ff0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
15000 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
15010 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
15020 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
15030 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
15040 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
15050 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
15060 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
15070 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
15080 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
15090 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
150a0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
150b0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
150c0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
150d0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
150e0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
150f0 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67  te3pager_get(Pag
15100 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15110 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
15120 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
15130 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
15140 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
15150 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
15160 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
15170 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
15180 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
15190 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
151a0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
151b0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
151c0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
151d0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
151e0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
151f0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15200 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
15210 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15220 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
15230 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
15240 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
15250 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
15260 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
15270 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
15280 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
15290 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
152a0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
152b0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
152c0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
152d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
152e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
152f0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15300 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
15310 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
15320 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
15330 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15340 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
15350 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
15360 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
15370 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
15380 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
15390 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
153a0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
153b0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
153c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
153d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
153e0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
153f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
15400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15410 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
15420 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
15430 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
15440 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
15450 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
15460 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
15470 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
15480 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
15490 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
154a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
154b0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
154c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  r) ){.       int
154d0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20   rc;..       /* 
154e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
154f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15500 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
15510 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
15520 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
15530 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
15540 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
15550 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
15560 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
15570 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
15580 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
15590 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
155a0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
155b0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
155c0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
155d0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
155e0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
155f0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
15600 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
15610 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
15620 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
15630 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
15640 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
15650 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
15660 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
15670 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
15680 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
15690 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
156a0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
156b0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
156c0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
156d0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
156e0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
156f0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
15700 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
15710 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
15720 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
15740 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
15750 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
15760 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
15770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15790 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
157a0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
157b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
157c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
157d0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
157e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
157f0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15800 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
15810 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
15820 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
15830 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
15840 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
15850 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
15860 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
15870 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
15880 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
15890 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
158a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
158b0 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
158c0 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
158d0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
158e0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
158f0 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
15900 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
15910 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
15920 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
15930 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
15940 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
15950 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
15960 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
15970 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
15980 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
15990 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
159a0 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
159b0 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
159c0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
159d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
159e0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
159f0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
15a00 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
15a10 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
15a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
15a40 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
15a50 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
15a60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
15a70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
15a80 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
15a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
15aa0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
15ab0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15ac0 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
15ad0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15ae0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
15af0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
15b00 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
15b10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
15b20 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
15b30 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15b40 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
15b50 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
15b60 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
15b70 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
15b80 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
15b90 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
15ba0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
15bb0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
15bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
15bd0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15be0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15c00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
15c10 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
15c20 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15c40 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
15c50 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
15c60 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
15c70 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
15c80 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
15c90 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
15ca0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
15cb0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
15cc0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15cd0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15ce0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
15cf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15d00 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
15d10 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
15d20 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
15d30 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
15d40 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
15d50 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
15d60 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
15d70 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
15d80 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
15d90 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
15da0 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
15db0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
15dc0 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
15dd0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
15de0 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
15df0 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
15e00 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
15e30 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
15e40 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
15e70 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
15e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
15e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
15ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15eb0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
15ec0 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
15ed0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
15ee0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
15ef0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
15f00 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
15f10 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
15f20 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
15f30 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
15f40 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
15f50 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
15f60 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
15f70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
15f80 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
15f90 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
15fa0 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
15fb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15fc0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d  nPage>pPager->nM
15fd0 61 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  axPage ){.      
15fe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15ff0 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61  ->nMaxPage==(pPa
16000 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b  ger->nPage-1) );
16010 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16020 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20  >nMaxPage++;.   
16030 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
16040 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
16050 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
16060 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   1, &pPg);.     
16070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16090 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
160a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
160b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
160c0 72 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a  rt(pPg) ;.    }.
160d0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
160e0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
160f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16100 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16110 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16120 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
16130 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
16140 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16150 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
16160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16170 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
16180 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16190 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
161a0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
161b0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
161c0 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
161d0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
161e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
161f0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16200 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
16210 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
16220 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16230 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
16240 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
16250 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
16260 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
16270 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
16280 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
16290 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
162a0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
162b0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
162c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
162d0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
162e0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
162f0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
16300 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
16310 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
16320 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
16330 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
16340 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72  +;.    h = pager
16350 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20  _hash(pgno);.   
16360 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
16370 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
16380 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
16390 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
163a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
163b0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
163c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
163d0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
163e0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
163f0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
16400 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
16410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16420 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
16430 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
16440 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
16450 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
16460 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
16470 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16480 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
16490 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
164a0 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
164b0 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
164c0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
164d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
164e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
164f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16500 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
16510 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e  pPager)<(int)pgn
16520 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
16530 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16540 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16550 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
16570 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72   rc;.      asser
16580 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
16590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
165a0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
165b0 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
165c0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
165d0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ze);.      if( r
165e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
165f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16600 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
16610 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
16620 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20  DATA(pPg),.     
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16650 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16660 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33    }.      TRACE3
16670 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
16680 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16690 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
166a0 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  o);.      CODEC(
166b0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
166c0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
166d0 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20  >pgno, 3);.     
166e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
166f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  OK ){.        i6
16700 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  4 fileSize;.    
16710 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
16720 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
16730 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21  ->fd,&fileSize)!
16740 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
16750 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c            || fil
16760 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67  eSize>=pgno*pPag
16770 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
16780 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16790 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
167a0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
167b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
167c0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
167d0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
167e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167f0 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c       clear_simul
16800 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b  ated_io_error();
16810 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
16820 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16830 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16840 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16860 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
16870 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16880 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
16890 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
168a0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
168b0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
168c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
168d0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
168e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
168f0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
16900 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
16910 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53  ache. */.    TES
16920 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
16930 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
16940 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
16950 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
16960 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
16970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
16990 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
169a0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
169b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
169c0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
169d0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
169e0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
169f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
16a00 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
16a10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16a20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
16a30 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
16a40 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
16a50 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
16a60 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
16a70 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
16a80 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
16a90 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
16aa0 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
16ab0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
16ac0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
16ad0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
16ae0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
16af0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
16b00 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
16b10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
16b30 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
16b40 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
16b50 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
16b60 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
16b70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16b80 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
16b90 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
16ba0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
16bb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
16bc0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
16bd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
16be0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
16bf0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
16c00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16c10 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
16c20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
16c30 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
16c40 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
16c50 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
16c60 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
16c70 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
16c80 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
16c90 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
16ca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
16cb0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
16cc0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
16cd0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
16ce0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
16cf0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
16d00 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
16d10 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
16d20 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
16d30 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
16d40 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
16d50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
16d60 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
16d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
16d80 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
16d90 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
16da0 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
16db0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
16dc0 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
16dd0 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
16de0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
16df0 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
16e00 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
16e10 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
16e20 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
16e30 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
16e40 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
16e50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16e60 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
16e70 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
16e80 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
16e90 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
16ea0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
16eb0 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
16ec0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
16ed0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
16ee0 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ger;.    pPager 
16ef0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
16f00 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
16f10 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  e = 0;.    pPg->
16f20 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67  pPrevFree = pPag
16f30 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70  er->pLast;.    p
16f40 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
16f50 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
16f60 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
16f70 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
16f80 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
16f90 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pPg;.    }else{.
16fa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
16fb0 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  irst = pPg;.    
16fc0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
16fd0 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  eedSync==0 && pP
16fe0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
16ff0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ed==0 ){.      p
17000 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17010 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ced = pPg;.    }
17020 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17030 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
17040 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
17050 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
17060 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17070 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
17080 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
17090 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
170a0 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
170b0 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
170c0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
170d0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
170e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
170f0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
17100 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
17110 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17120 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
17130 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61  EMDB ){.      pa
17140 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17150 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
17180 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
17190 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
171a0 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
171b0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
171c0 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
171d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
171e0 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
171f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17200 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
17210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17220 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
17230 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17240 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
17250 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
17260 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
17270 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
17280 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
17290 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
172a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
172b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
172c0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
172d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
172e0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
172f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17310 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17320 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
17330 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
17340 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17350 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
17360 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
17370 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
17380 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17390 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
173a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
173b0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
173c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
173d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
173e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
173f0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
17400 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
17410 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
17420 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
17430 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
17440 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
17450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
17480 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
17490 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
174a0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
174b0 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
174c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
174d0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
174e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
174f0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
17500 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
17510 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
17520 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  lSync(pPager->jf
17530 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  d, pPager->fullS
17540 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ync);.  sqlite3O
17550 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
17560 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
17570 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  >fullSync);.  sq
17580 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
17590 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  tory(pPager->jfd
175a0 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  , pPager->zDirec
175b0 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d  tory);.  pPager-
175c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
175d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
175e0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
175f0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
17600 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
17610 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
17620 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17630 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
17640 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17650 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
17660 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
17670 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
17680 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
17690 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
176a0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
176b0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
176c0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
176d0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
176e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
176f0 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
17700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17710 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
17720 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65  stmt_begin(pPage
17730 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
17740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
17750 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
17760 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
17770 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
17780 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
17790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
177a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
177b0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
177c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
177d0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
177e0 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
177f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
17800 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
17810 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
17820 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
17830 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
17840 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
17850 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
17860 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  ure, then we wil
17870 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67  l not be closing
17880 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
17890 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74  * file. So delet
178a0 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  e any journal fi
178b0 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a  le we may have j
178c0 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68  ust created. Oth
178d0 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74  erwise,.    ** t
178e0 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67  he system will g
178f0 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20  et confused, we 
17900 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  have a read-lock
17910 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
17920 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72   a.    ** myster
17930 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73  ious journal has
17940 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65   appeared in the
17950 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20   filesystem..   
17960 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
17970 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
17980 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c  zJournal);.  }el
17990 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  se{.    sqlite3O
179a0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
179b0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
179c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
179d0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
179e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
179f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
17a00 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
17a10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
17a20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
17a30 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
17a40 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
17a50 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
17a60 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
17a70 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69  pager_commit() i
17a80 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
17a90 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
17aa0 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
17ab0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
17ac0 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
17ad0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
17ae0 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
17af0 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c  r_unref() is cal
17b00 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
17b10 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
17b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
17b30 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
17b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
17b60 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
17b70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
17b80 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
17b90 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
17ba0 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
17bb0 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
17bc0 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
17bd0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
17be0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
17bf0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
17c00 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
17c10 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
17c20 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
17c30 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
17c40 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
17c50 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
17c60 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
17c70 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
17c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
17c90 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
17ca0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
17cb0 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
17cc0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
17cd0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
17ce0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
17cf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
17d00 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
17d10 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
17d20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
17d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
17d40 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
17d50 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
17d60 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
17d70 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
17d80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
17d90 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
17da0 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
17db0 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
17dc0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17dd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
17de0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
17df0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
17e00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
17e10 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
17e20 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
17e30 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
17e40 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
17e50 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
17e60 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
17e70 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
17e80 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
17e90 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
17ea0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  t sqlite3pager_b
17eb0 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61  egin(void *pData
17ec0 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20  , int exFlag){. 
17ed0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
17ee0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
17ef0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
17f00 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
17f10 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
17f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
17f30 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
17f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17f50 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
17f60 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
17f70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
17f80 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
17f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17fa0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
17fb0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  0 );.    if( MEM
17fc0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
17fd0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17fe0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
17ff0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
18000 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
18010 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
18020 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
18030 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
18040 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
18050 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
18060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18070 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
18080 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18090 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
180a0 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
180b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
180c0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
180d0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
180e0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
180f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18130 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18140 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
18150 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  ;.      TRACE2("
18160 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
18170 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18180 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
18190 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
181a0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
181b0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
181c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
181d0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
181e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
181f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
18210 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
18220 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
18230 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
18240 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
18250 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
18260 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
18270 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
18280 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
18290 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
182a0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
182b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
182c0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
182d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
182e0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
182f0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
18300 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
18310 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
18320 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
18330 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
18340 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
18350 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
18360 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18370 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
18380 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
18390 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
183a0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
183b0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
183c0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
183d0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
183e0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
183f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18400 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
18410 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
18420 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
18430 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
18440 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
18450 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
18460 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18470 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
18480 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
18490 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
184a0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
184b0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
184c0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
184d0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
184e0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
184f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
18500 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
18510 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
18520 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
18530 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18540 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
18550 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
18560 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
18570 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
18580 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
18590 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
185a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
185b0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
185c0 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
185d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
185e0 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
185f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
18600 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
18610 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
18620 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
18630 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
18640 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
18650 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
18660 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
18670 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
18680 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18690 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
186a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
186b0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
186c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
186d0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
186e0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
186f0 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
18700 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
18710 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
18720 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
18730 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
18740 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
18750 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
18760 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
18770 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
18780 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
18790 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
187a0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
187b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
187c0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
187d0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
187e0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
187f0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
18800 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
18810 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
18820 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
18830 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
18840 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
18850 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
18860 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
18870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18880 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18890 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
188a0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
188b0 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
188c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
188d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
188e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
188f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18900 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
18910 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
18920 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
18930 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
18940 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
18950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
18960 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
18970 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18990 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
189a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
189b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
189c0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
189d0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
189e0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
189f0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
18a00 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
18a10 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
18a20 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
18a30 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
18a40 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
18a50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
18a60 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18a70 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
18a80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
18a90 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
18aa0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18ab0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
18ac0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
18ad0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
18ae0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
18af0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
18b00 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
18b10 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
18b20 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
18b30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
18b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
18b50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
18b60 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
18b70 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
18b80 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18b90 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18ba0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18bb0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
18bc0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
18bd0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18be0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18bf0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18c00 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
18c10 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
18c20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
18c30 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
18c40 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
18c50 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
18c60 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
18c70 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18c80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
18c90 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
18ca0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
18cb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18cd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18ce0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
18cf0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;.          /* 
18d00 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
18d10 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
18d20 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
18d30 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
18d40 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
18d50 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
18d60 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18d70 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
18d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
18d90 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
18da0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18db0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
18dc0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
18dd0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
18de0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
18df0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18e00 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
18e10 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
18e20 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
18e30 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
18e40 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
18e50 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
18e60 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
18e70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  r);.          st
18e80 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c  ore32bits(cksum,
18e90 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61   pPg, pPager->pa
18ea0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
18eb0 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
18ec0 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
18ed0 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
18ee0 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
18ef0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20  Pg, -4);.       
18f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18f10 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
18f20 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
18f30 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
18f40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
18f50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
18f60 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
18f70 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
18f80 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
18f90 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
18fb0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18fc0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
18fd0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
18fe0 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
18ff0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
19000 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 0);.         
19010 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
19020 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
19030 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  er) = saved;.   
19040 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
19070 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
19080 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19090 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
190a0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
190b0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65           pager_e
190c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c  rror(pPager, SQL
190d0 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20  ITE_FULL);.     
190e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
190f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19100 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19110 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
19120 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
19130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19140 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
19150 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
19160 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
19170 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
19180 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
19190 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
191a0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
191b0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
191c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
191d0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
191e0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
191f0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
19200 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
19210 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
19220 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
19230 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
19240 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
19250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19270 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
19280 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
19290 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
192a0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
192b0 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e     TRACE4("APPEN
192c0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
192d0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
192f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19300 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
19310 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
19320 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
19330 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
19340 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
19350 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
19360 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
19370 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
19380 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
19390 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
193a0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
193b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
193c0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
193d0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
193e0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
193f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
19400 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
19410 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
19420 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
19430 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
19440 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
19450 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
19460 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
19470 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
19480 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
19490 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
194a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
194b0 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
194c0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
194d0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
194e0 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  tmtSize ){.     
194f0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
19500 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
19510 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
19520 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
19530 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
19540 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
19550 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19560 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19570 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19580 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
19590 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
195a0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
195b0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
195c0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
195d0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
195e0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
195f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
19600 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
19610 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
19620 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
19630 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
19640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
19650 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
19660 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
19670 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19680 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
19690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196a0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
196b0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
196c0 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
196d0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
196e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
196f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19700 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
19710 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a  er->stfd,((char*
19720 29 70 44 61 74 61 29 2d 34 2c 0a 20 20 20 20 20  )pData)-4,.     
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19750 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
19760 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
19770 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
19780 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
19790 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
197a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
197b0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
197c0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
197d0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
197e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
197f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19800 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
19810 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
19820 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
19830 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19840 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
19850 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49  ror(pPager, SQLI
19860 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20 20  TE_FULL);.      
19870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19880 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
198a0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
198b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
198c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
198d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
198e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
198f0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
19900 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
19910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19920 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
19930 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
19940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
19950 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
19960 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
19970 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
19980 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
19990 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
199a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
199b0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
199c0 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
199d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
199e0 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
199f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
19a00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
19a10 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
19a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19a30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
19a40 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
19a50 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
19a60 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
19a70 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
19a80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
19a90 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
19aa0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
19ab0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
19ac0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
19ad0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
19ae0 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
19af0 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
19b00 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
19b10 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
19b20 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19b30 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
19b40 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
19b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19b60 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
19b70 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
19b80 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
19b90 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
19ba0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
19bb0 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
19bc0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
19bd0 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
19be0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
19bf0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
19c00 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f  id *pData){.  vo
19c10 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  id *pPage;.  int
19c20 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
19c30 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
19c40 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61  ager, pgno, &pPa
19c50 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
19c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c70 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19c80 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
19c90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19ca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
19cb0 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61  emcpy(pPage, pDa
19cc0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
19cd0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
19ce0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
19cf0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
19d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
19d10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
19d20 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
19d30 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
19d40 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
19d50 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
19d60 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
19d70 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
19d80 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20   "pgno" back to 
19d90 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
19da0 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
19db0 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
19dc0 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
19dd0 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
19de0 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
19df0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
19e00 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
19e10 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
19e20 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
19e30 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
19e40 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
19e50 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
19e60 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
19e70 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
19e80 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
19e90 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
19ea0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
19eb0 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
19ec0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  e.** sqlite3page
19ed0 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
19ee0 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
19ef0 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
19f00 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
19f10 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
19f20 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
19f30 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
19f40 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
19f50 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
19f60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
19f70 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
19f80 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
19f90 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
19fa0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
19fb0 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
19fc0 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
19fd0 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
19fe0 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
19ff0 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
1a000 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1a010 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
1a020 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
1a030 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
1a040 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1a050 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
1a060 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
1a070 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
1a080 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
1a090 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
1a0a0 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
1a0b0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1a0c0 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
1a0d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1a0e0 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
1a0f0 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
1a100 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1a110 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1a120 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
1a130 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
1a140 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1a150 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1a160 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
1a170 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
1a180 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61  s.** critical da
1a190 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
1a1a0 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
1a1b0 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  gets rolled back
1a1c0 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20   in spite.** of 
1a1d0 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
1a1e0 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
1a1f0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  d sqlite3pager_d
1a200 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20  ont_write(Pager 
1a210 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1a220 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1a230 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  g;..  if( MEMDB 
1a240 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67  ) return;..  pPg
1a250 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1a260 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1a270 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a280 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
1a290 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
1a2a0 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
1a2b0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69  mtInUse ){.    i
1a2c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1a2d0 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1a2e0 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1a2f0 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1a300 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1a310 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1a320 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1a330 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1a340 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1a350 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1a360 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1a370 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1a380 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1a390 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1a3a0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1a3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a3c0 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1a3d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1a3e0 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1a3f0 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1a400 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1a410 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1a420 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1a430 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1a440 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1a450 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1a460 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1a470 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1a480 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1a490 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1a4a0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1a4b0 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1a4c0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1a4d0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1a4e0 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1a4f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1a500 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1a510 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e       TRACE3("DON
1a520 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1a530 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20  of %d\n", pgno, 
1a540 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1a550 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
1a560 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
1a570 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1a580 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
1a590 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1a5a0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1a5b0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
1a5c0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1a5d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1a5e0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1a5f0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
1a600 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
1a610 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1a620 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
1a630 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
1a640 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
1a650 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1a660 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
1a670 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
1a680 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
1a690 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
1a6a0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
1a6b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1a6c0 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
1a6d0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1a6e0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1a6f0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1a700 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a710 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1a720 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a730 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
1a740 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
1a750 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
1a760 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
1a770 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a780 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
1a790 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
1a7a0 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1a7b0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1a7c0 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1a7d0 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1a7e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1a7f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a800 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1a810 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1a820 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1a830 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a840 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a850 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1a860 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
1a870 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1a880 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1a890 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1a8a0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1a8b0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1a8c0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1a8d0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1a8e0 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
1a8f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
1a900 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
1a910 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
1a920 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20  (pPager));.  }. 
1a930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1a940 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
1a950 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
1a960 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1a970 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
1a980 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1a990 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1a9a0 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1a9b0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1a9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a9d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1a9e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1a9f0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1aa00 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1aa10 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
1aa20 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1aa30 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  st(pPg);.  }.}..
1aa40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aa50 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
1aa60 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
1aa70 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
1aa80 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
1aa90 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
1aaa0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
1aab0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1aac0 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
1aad0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1aae0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
1aaf0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
1ab00 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
1ab10 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
1ab20 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
1ab30 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  f../*.** Commit 
1ab40 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
1ab50 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1ab60 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1ab70 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
1ab80 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
1ab90 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
1aba0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
1abb0 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
1abc0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1abd0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
1abe0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
1abf0 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
1ac00 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
1ac10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1ac20 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
1ac30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1ac40 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
1ac50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
1ac60 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
1ac70 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  E_FULL ){.    rc
1ac80 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1ac90 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
1aca0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1acb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1acc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1acd0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
1ace0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1acf0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ad00 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1ad10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1ad20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ad30 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ad40 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
1ad50 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
1ad60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1ad70 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
1ad80 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
1ad90 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1ada0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1adb0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1adc0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1add0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
1ade0 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
1adf0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
1ae00 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1ae10 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20  g, pPager));.   
1ae20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1ae30 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1ae40 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1ae50 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
1ae60 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1ae70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1ae80 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1ae90 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1aea0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69  pDirty;.    }.#i
1aeb0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1aec0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1aed0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1aee0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1aef0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1af00 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1af10 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1af20 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1af30 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
1af40 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1af50 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
1af60 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1af70 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1af80 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
1af90 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
1afa0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1afb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1afc0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1afd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1afe0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1aff0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b000 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
1b010 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
1b020 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
1b030 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
1b040 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
1b050 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
1b060 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
1b070 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1b080 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1b090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b0a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
1b0b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1b0c0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b0d0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b0e0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b100 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1b110 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b120 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
1b130 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
1b140 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ager, 0, 0);.  i
1b150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b160 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
1b170 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
1b180 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1b190 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1b1a0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1b1b0 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
1b1c0 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
1b1d0 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67  here if anything
1b1e0 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69   goes wrong duri
1b1f0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
1b200 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d  ocess..  */.comm
1b210 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69  it_abort:.  sqli
1b220 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
1b230 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  k(pPager);.  ret
1b240 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b250 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
1b260 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
1b270 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
1b280 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
1b290 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
1b2a0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
1b2b0 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
1b2c0 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
1b2d0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
1b2e0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
1b2f0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
1b300 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1b310 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
1b320 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1b330 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
1b340 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
1b350 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
1b360 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
1b370 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
1b380 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
1b390 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
1b3a0 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
1b3b0 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
1b3c0 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
1b3d0 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
1b3e0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
1b3f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
1b400 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
1b410 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
1b420 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
1b430 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
1b440 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
1b450 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1b460 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
1b470 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
1b480 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1b490 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1b4a0 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
1b4b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1b4c0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1b4d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
1b4e0 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
1b4f0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1b500 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
1b510 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1b520 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
1b530 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
1b540 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
1b550 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
1b560 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
1b570 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
1b580 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
1b590 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
1b5a0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
1b5b0 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
1b5c0 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
1b5d0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
1b5e0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
1b5f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b600 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
1b610 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1b620 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
1b630 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1b640 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
1b650 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
1b660 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
1b670 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
1b680 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1b690 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41    TRACE3("ROLLBA
1b6a0 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
1b6b0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
1b6c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b6d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b6e0 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47       TRACE3("PAG
1b6f0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
1b700 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
1b710 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b730 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
1b740 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
1b750 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1b760 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
1b770 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
1b780 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
1b790 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
1b7a0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  NextStmt = 0;.. 
1b7b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b7c0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
1b7d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1b7e0 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
1b7f0 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
1b800 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1b810 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
1b820 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  }.    pPager->pS
1b830 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1b840 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1b850 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1b860 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
1b870 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
1b880 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1b890 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1b8a0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1b8b0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
1b8c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b8d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1b8e0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b8f0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
1b900 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
1b910 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1b920 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1b930 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b940 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
1b950 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
1b960 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1b970 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1b980 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1b990 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
1b9a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b9b0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
1b9c0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
1b9d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1b9e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50   }.    return pP
1b9f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1ba00 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1ba10 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
1ba20 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
1ba30 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
1ba40 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
1ba50 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
1ba60 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
1ba70 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1ba80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ba90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1baa0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1bab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1bac0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1bad0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1bae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1baf0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
1bb00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1bb10 54 3b 0a 20 20 20 20 70 61 67 65 72 5f 65 72 72  T;.    pager_err
1bb20 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54  or(pPager, SQLIT
1bb30 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 7d 0a  E_CORRUPT);.  }.
1bb40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1bb50 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
1bb60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1bb70 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1bb80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1bb90 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
1bba0 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
1bbb0 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
1bbc0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
1bbd0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
1bbe0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1bbf0 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  _isreadonly(Page
1bc00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1bc10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
1bc20 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
1bc30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1bc40 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
1bc50 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
1bc60 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
1bc70 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50  te3pager_stats(P
1bc80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1bc90 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
1bca0 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
1bcb0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
1bcc0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
1bcd0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
1bce0 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
1bcf0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
1bd00 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
1bd10 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
1bd20 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
1bd30 43 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Code;.#ifdef SQL
1bd40 49 54 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d 20  ITE_TEST.  a[6] 
1bd50 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
1bd60 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
1bd70 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
1bd80 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
1bd90 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
1bda0 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
1bdb0 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
1bdc0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1bdd0 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
1bde0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1bdf0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
1be00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1be10 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
1be20 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
1be30 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1be40 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
1be50 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
1be60 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
1be70 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
1be80 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
1be90 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
1bea0 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
1beb0 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
1bec0 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
1bed0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1bee0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
1bef0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1bf00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1bf10 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
1bf20 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
1bf30 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1bf40 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
1bf50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bf60 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
1bf70 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45   TRACE2("STMT-BE
1bf80 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
1bf90 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
1bfa0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1bfb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1bfc0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1bfd0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
1bfe0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1bff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c000 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
1c010 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c020 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
1c030 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1c040 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1c050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c070 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1c080 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c090 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1c0a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
1c0b0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
1c0c0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
1c0d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
1c0e0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1c0f0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
1c100 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
1c110 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1c120 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
1c130 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
1c140 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1c150 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
1c160 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
1c170 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
1c180 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
1c190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c1a0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
1c1b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c1c0 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
1c1d0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1c1e0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1c1f0 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
1c200 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
1c210 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
1c220 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
1c230 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1c240 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
1c250 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
1c260 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
1c270 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
1c280 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1c290 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
1c2a0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
1c2b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1c2c0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1c2d0 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
1c2e0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
1c2f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1c300 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
1c310 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1c320 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1c330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
1c340 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
1c350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1c360 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
1c370 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
1c380 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
1c390 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1c3a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c3b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
1c3c0 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
1c3d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1c3e0 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
1c3f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c410 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
1c420 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
1c430 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
1c440 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
1c450 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c460 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
1c470 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
1c480 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
1c490 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
1c4a0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72    /* sqlite3OsTr
1c4b0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
1c4c0 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
1c4d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
1c4e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
1c4f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1c500 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
1c510 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  }.    for(pPg=pP
1c520 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
1c530 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
1c540 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
1c550 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
1c560 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1c570 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
1c580 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
1c590 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
1c5a0 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
1c5b0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1c5c0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1c5d0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1c5e0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1c5f0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1c600 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
1c610 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1c620 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
1c630 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1c640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c650 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1c660 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
1c670 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1c680 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1c690 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
1c6a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1c6b0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
1c6c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c6d0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1c6e0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
1c6f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1c700 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_stmt_rollback(
1c710 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c720 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1c730 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c740 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28  e ){.    TRACE2(
1c750 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
1c760 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c770 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1c780 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
1c790 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
1c7a0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1c7b0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
1c7c0 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
1c7d0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1c7e0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1c7f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1c800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c810 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
1c820 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
1c830 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1c840 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
1c850 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
1c860 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c870 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1c880 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1c890 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1c8a0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1c8b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c8c0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c8d0 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
1c8e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f  Size;.      memo
1c8f0 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
1c900 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1c910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c920 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1c930 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
1c940 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1c950 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
1c960 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
1c970 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
1c980 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c990 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
1c9a0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1c9b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1c9c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1c9d0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
1c9e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1c9f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
1ca00 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1ca10 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28  3pager_filename(
1ca20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ca30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1ca40 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
1ca50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ca60 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
1ca70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1ca80 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1ca90 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e  qlite3pager_dirn
1caa0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1cab0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1cac0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
1cad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cae0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1caf0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
1cb00 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
1cb10 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
1cb20 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28  ger_journalname(
1cb30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1cb40 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1cb50 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
1cb60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1cb70 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
1cb80 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
1cb90 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
1cba0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
1cbb0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
1cbc0 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
1cbd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cbe0 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67  pager_nosync(Pag
1cbf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1cc00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
1cc10 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Sync;.}../*.** S
1cc20 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
1cc30 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
1cc40 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1cc50 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
1cc60 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
1cc70 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
1cc80 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
1cc90 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
1cca0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
1ccb0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
1ccc0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
1ccd0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
1cce0 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
1ccf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1cd00 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1cd10 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1cd20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1cd30 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1cd40 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1cd50 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1cd60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1cd70 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1cd80 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1cd90 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
1cda0 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
1cdb0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1cdc0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1cdd0 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
1cde0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1cdf0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1ce00 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1ce10 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
1ce20 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
1ce30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ce40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1ce50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1ce60 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1ce70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ce80 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ce90 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1cea0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
1ceb0 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
1cec0 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
1ced0 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
1cee0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1cef0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1cf00 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
1cf10 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1cf20 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1cf30 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1cf40 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1cf50 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1cf60 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32  ter++;.  store32
1cf70 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e  bits(change_coun
1cf80 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29  ter, pPgHdr, 24)
1cf90 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
1cfa0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1cfb0 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
1cfc0 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
1cfd0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1cfe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1cff0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1d000 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1d010 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
1d020 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
1d030 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
1d040 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d050 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1d060 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1d070 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
1d080 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1d090 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
1d0a0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
1d0b0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
1d0c0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
1d0d0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
1d0e0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1d0f0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
1d100 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
1d110 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1d120 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
1d130 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
1d140 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
1d150 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
1d160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d170 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
1d180 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
1d190 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
1d1a0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1d1b0 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
1d1c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d1d0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
1d1e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
1d1f0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
1d200 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
1d210 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
1d220 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
1d230 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
1d240 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
1d250 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
1d260 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
1d270 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1d280 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1d290 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1d2a0 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1d2b0 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1d2c0 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1d2d0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1d2e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1d2f0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1d300 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
1d310 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
1d320 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
1d330 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
1d340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d350 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44  OK;..  TRACE4("D
1d360 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1d370 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1d380 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1d390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1d3a0 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1d3b0 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1d3c0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1d3d0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1d3e0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1d3f0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1d400 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1d410 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1d420 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1d430 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1d440 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1d450 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1d460 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1d470 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1d480 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1d490 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1d4a0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1d4b0 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1d4c0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1d4d0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1d4e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d4f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1d500 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1d510 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1d520 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1d530 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1d540 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1d550 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1d560 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1d570 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1d580 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1d590 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1d5a0 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1d5b0 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1d5c0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1d5d0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1d5e0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1d5f0 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1d600 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d610 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1d620 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1d630 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1d640 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1d650 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1d660 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1d670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d680 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1d690 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d6a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1d6b0 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1d6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1d6d0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1d6e0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1d6f0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1d700 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1d710 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1d720 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1d730 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1d740 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1d750 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1d760 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1d770 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d780 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1d790 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a     void *pPage;.
1d7a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69          int iSki
1d7b0 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
1d7c0 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
1d7d0 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
1d7e0 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
1d7f0 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
1d800 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1d810 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1d820 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c  rnal[i/8] & (1<<
1d830 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53  (i&7))) && i!=iS
1d840 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
1d850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1d860 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1d870 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
1d880 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1d8a0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1d8b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d8c0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1d8d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1d8e0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
1d8f0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1d900 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d920 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1d930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d940 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1d950 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1d960 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1d970 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1d980 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1d990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d9a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1d9b0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1d9c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1d9d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d9e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d9f0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1da00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1da10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1da20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1da30 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1da40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
1da50 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1da60 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1da70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1da80 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1da90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1daa0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1dab0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1dac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1dad0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1dae0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1daf0 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1db00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1db10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1db20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1db30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1db40 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
1db50 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
1db60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1db70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1db80 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1db90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1dba0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1dbb0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  0);.    }..    p
1dbc0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1dbd0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1dbe0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1dbf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1dc00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dc10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
1dc20 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
1dc30 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
1dc40 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
1dc50 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
1dc60 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1dc70 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
1dc80 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
1dc90 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
1dca0 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
1dcb0 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
1dcc0 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
1dcd0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
1dce0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
1dcf0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
1dd00 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
1dd10 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
1dd20 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
1dd30 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
1dd40 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
1dd50 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
1dd60 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1dd70 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
1dd80 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
1dd90 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
1dda0 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
1ddb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ddc0 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
1ddd0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
1dde0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
1ddf0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
1de00 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
1de10 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
1de20 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1de30 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
1de40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
1de50 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
1de60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1de70 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
1de80 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
1de90 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
1dea0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1deb0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
1dec0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
1ded0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
1dee0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
1def0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
1df00 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
1df10 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
1df20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1df30 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
1df40 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1df50 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1df60 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1df70 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1df80 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1df90 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1dfa0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1dfb0 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
1dfc0 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
1dfd0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1dfe0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1dff0 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
1e000 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
1e010 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
1e020 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
1e030 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1e040 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1e050 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
1e060 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ;..  if( pPg->ne
1e070 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
1e080 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
1e090 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
1e0a0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1e0b0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
1e0c0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
1e0d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e0e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1e0f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1e100 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
1e110 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
1e120 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1e130 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
1e140 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1e150 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
1e160 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
1e170 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
1e180 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1e190 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
1e1a0 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
1e1b0 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
1e1c0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
1e1d0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
1e1e0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
1e1f0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1e200 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
1e210 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
1e220 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
1e230 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
1e240 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1e250 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
1e260 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1e270 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
1e280 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
1e290 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1e2a0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
1e2b0 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  Old->dirty = 0;.
1e2c0 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
1e2d0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1e2e0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e2f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1e300 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1e310 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
1e320 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
1e330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e340 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1e350 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
1e360 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
1e370 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
1e380 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
1e390 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
1e3a0 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70  sh-chain. */.  p
1e3b0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1e3c0 0a 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  .  h = pager_has
1e3d0 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  h(pgno);.  if( p
1e3e0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1e3f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e400 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
1e410 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1e420 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1e430 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1e440 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
1e450 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1e460 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1e470 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
1e480 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
1e490 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
1e4a0 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  ..  pPg->dirty =
1e4b0 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   1;.  pPager->di
1e4c0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
1e4d0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
1e4e0 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
1e4f0 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
1e500 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1e510 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
1e520 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
1e530 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
1e540 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
1e550 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
1e560 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
1e570 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
1e580 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
1e590 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
1e5a0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
1e5b0 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
1e5c0 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
1e5d0 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
1e5e0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
1e5f0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
1e600 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
1e610 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
1e620 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1e630 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
1e640 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
1e650 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
1e660 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61  ** The sqlite3pa
1e670 67 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d  ger_get() call m
1e680 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
1e690 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
1e6a0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1e6b0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
1e6c0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1e6d0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
1e6e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69   int rc;.    voi
1e6f0 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20  d *pNeedSync;.  
1e700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e710 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1e720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1e730 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1e740 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
1e750 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69  NeedSync);.    i
1e760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e780 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1e790 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1e7a0 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1e7b0 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ync)->needSync =
1e7c0 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1e7d0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1e7e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1e7f0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e800 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64  DR(pNeedSync)->d
1e810 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71  irty = 1;.    sq
1e820 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1e830 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d  (pNeedSync);.  }
1e840 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1e850 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1e860 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1e870 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1e880 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1e890 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1e8a0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1e8b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
1e8c0 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1e8d0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
1e8e0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
1e8f0 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
1e900 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
1e910 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
1e920 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
1e930 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
1e940 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1e950 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  r_lockstate(Page
1e960 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1e970 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f  turn sqlite3OsLo
1e980 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e  ckState(pPager->
1e990 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  fd);.}.#endif..#
1e9a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1e9b0 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
1e9c0 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
1e9d0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
1e9e0 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
1e9f0 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
1ea00 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75  lite3pager_refdu
1ea10 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
1ea20 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1ea30 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
1ea40 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1ea50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1ea60 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
1ea70 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
1ea80 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
1ea90 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
1eaa0 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
1eab0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
1eac0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
1ead0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1eae0 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
1eaf0 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
1eb00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
1eb10 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.